Bun の m2m リレーションは全ての DB 初期化経路で中間テーブルを RegisterModel する
Go
Bun
ORM
テスト
知識
判断
運用
Bun ORM で bun:"m2m:join_table,join:A=B" の多対多リレーションを使う場合、join table のモデルを db.RegisterModel((*JoinTable)(nil)) で登録しておく必要がある。登録がない DB インスタンスで対象モデルを扱うと、クエリ実行前の model 初期化時点で bun: can't find m2m ... table (use db.RegisterModel) の panic が起きる。
適用条件
- Bun の
m2m:タグで多対多リレーションを定義している。 - アプリ本体以外にも、schema 生成、migration 生成、repository test、integration test、fixture 挿入 helper など、複数箇所で
bun.NewDBまたは DB 接続初期化を行っている。
判断基準
- m2m join table を追加したら、アプリ本体の DB 接続だけでなく、テスト用 DB helper、schema 生成用 DB 接続、sqlmock 用 DB 初期化など、全ての DB 初期化経路に同じ
RegisterModelを追加する。 - 1 箇所だけ直しても、別経路で同じモデルを insert/select した瞬間に panic するため、
bun.NewDBとRegisterModelの呼び出しを検索して漏れを確認する。 - 可能なら DB 初期化処理を共通化し、m2m 登録リストが本番・テスト・生成処理で分岐しないようにする。
検証
追加後は通常の unit test だけでなく、対象 repository の integration test や fixture 挿入 helper を通るテストを実行する。schema 生成処理が Bun の CreateTable を使っている場合は、schema/migration 生成コマンドも実行して、登録漏れで panic しないことを確認する。