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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

GoConnect #11

Avatar for MakKi

MakKi

March 18, 2026
Tweet

More Decks by MakKi

Other Decks in Programming

Transcript

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

    スマホゲーム、主にサーバサイドや同期通信まわり • OSS ◦ gozxing: バーコードQRコードリーダーライター ◦ arelo: 自動リロードユーティリティ ◦ WSNet2: スマホゲーム同期通信ライブラリ • コミュニティ ◦ TinyGo Keeb コアメンバー
  2. 次回のTinyGo Keeb はんだ付けワークショップ • 5/20 GopherCon Singapore • 5/30 Women

    Who Go Tokyo 10周年(秋葉原) はんだ付けなし • 4/12 技術書典(池袋)
  3. インプロセス DBとは インプロセスDB: • アプリと同じプロセスの中で DBエンジンが動いている ◦ SQLiteなどサーバとして動かないやつ インメモリDB: •

    メモリ上のみにデータを保存している ◦ アクセスが高速 ◦ 終了したら全部消える 今日話すのは、PureGoで実装されたインプロセスかつインメモリ なDB
  4. 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.
  5. テストでの利点・欠点 利点 • 環境に依存しない ◦ DBサーバやコンテナ不要 • 並列実行で混ざらない ◦ プロセスごとに独立

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

    まだ作ってないので誰かぜひ • SQL自体のチェックツール ◦ github.com/makiuchi-d/migy: SQLマイグレーションヘルパー
  7. 可逆性チェック:スキーマ不一致 • テーブルの構造の一致しない部分を 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
  8. 可逆性チェック:レコード不一致 • レコードの差分も検出(特定のカラムの違いは無視する指定も可能) $ 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
  9. 使ってわかった Goらしさ • 外部依存がない ◦ バイナリ1つで完結 ◦ DBサーバやデータファイル不要 • クロスコンパイルが簡単

    ◦ 手元とサーバでアーキテクチャが違っても楽ちん ▪ amd64とarm64 ▪ CGO依存がなければ何も考えずにできる