Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テストだけじゃない!インプロセスDBで生まれるGoらしさ

Avatar for MakKi MakKi
March 06, 2026

 テストだけじゃない!インプロセスDBで生まれるGoらしさ

Asakusa.go #7

Avatar for MakKi

MakKi

March 06, 2026
Tweet

More Decks by MakKi

Other Decks in Technology

Transcript

  1. 自己紹介 • 牧内大輔(MakKi) ◦ @makki_d ◦ makiuchi-d • KLab株式会社 ◦

    スマホゲーム、主にサーバサイドや同期通信まわり • OSS ◦ gozxing: バーコードQRコードリーダーライター ◦ arelo: 自動リロードユーティリティ ◦ WSNet2: スマホゲーム同期通信ライブラリ • コミュニティ ◦ TinyGo Keeb
  2. インプロセス DBとは インプロセスDB: • アプリと同じプロセスの中で DBエンジンが動いている ◦ SQLiteなどサーバとして動かないやつ インメモリDB: •

    メモリ上のみにデータを保存している ◦ アクセスが高速 ◦ 終了したら全部消える 今日話すのは、Goで実装されたインプロセスかつインメモリ なDB
  3. Go実装のインプロセス DB • github.com/dolthub/go-mysql-server ◦ MySQL互換 ▪ かなりがんばっている ▪ トランザクションはまだない

    ◦ Grafanaのバックエンドにも使われている • github.com/proullon/ramsql ◦ いちおうPostgreSQL風 ▪ ただし未実装機能が多い ◦ ユニットテストがメインターゲット The Go gopher was designed by Renee French, licensed under CC BY 4.0. The mascot image is based on work by Takuya Ueda, licensed under CC BY 3.0, with modifications.
  4. テストでの利点・欠点 利点 • 環境に依存しない ◦ DBサーバやコンテナ不要 • 並列実行で混ざらない ◦ プロセスごとに独立

    • 残ったデータが悪さしない ◦ まっさらな状態で起動、終了したら消える 欠点 • 本物のDBとは違う ◦ 対応していない機能もある
  5. テスト以外の使い道 SQLを単独で実行するCLIツール • json や tsv をSQLで処理するツール ◦ jqのようなやつ ◦

    まだ作ってないので誰かぜひ • SQL自体のチェックツール ◦ github.com/makiuchi-d/migy: SQLマイグレーションヘルパー
  6. 可逆性チェック:スキーマ不一致 • テーブルの構造の一致しない部分を Diff表示 $ migy check applying: 000000_init.all.sql applying:

    000010_create.up.sql ---- up/down applying: 000020_alter_add.up.sql applying: 000020_alter_add.down.sql checking... create table "table1" differs: ... `val` text NOT NULL DEFAULT '', + `val2` int DEFAULT '0', PRIMARY KEY (`id`) ... check failed
  7. 可逆性チェック:レコード不一致 • レコードの差分も検出(特定のカラムの違いは無視する指定も可能) $ migy check applying: 000030_insert.all.sql ---- up/down

    applying: 000040_alter_drop.up.sql applying: 000040_alter_drop.down.sql checking... records in "table1" differs: (1, 'aaa', 10) -(2, 'bbb', 20) -(3, 'ccc', 30) +(2, 'aaa', 20) +(3, 'aaa', 30) check failed
  8. 使ってわかった Goらしさ • 外部依存がない ◦ バイナリ1つで完結 ◦ DBサーバやデータファイル不要 • クロスコンパイルが簡単

    ◦ 手元とサーバでアーキテクチャが違っても楽ちん ▪ amd64とarm64 ▪ CGO依存があるとちょっと大変