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

golang-bob.pdf

 golang-bob.pdf

Avatar for Yura Iwatsuka

Yura Iwatsuka

October 09, 2026

More Decks by Yura Iwatsuka

Other Decks in Programming

Transcript

  1. DBアクセスは、何を起点に書くかで選ぶ 主な起点 使うものの例 自分で書くもの SQLを直接書く database/sql・pgx・sqlx SQLと、引数・結果の扱い SQLから生成する sqlc・Bob SQLとスキーマ

    DBから生成する SQLBoiler・Bob DBスキーマと、型付きの条件 Goで定義する GORM・Bun・ent モデル/スキーマの定義 https://go.dev/doc/database/ https://bob.stephenafamo.com/docs/code-generation/intro/ 5
  2. GORM:falseにしたいのに、更新されない 例:ユーザーを無効にする db.Model(&user).Updates( User{Active: false}, ) 意図とのずれ structのUpdatesは、既定でゼロ値 を更新しない 「未指定」と「falseへの変更」をど

    う分ける? 期待:active = false 実際:activeが更新対象から外れる Select / mapで回避できるが、書き 方を意識する https://gorm.io/docs/update.html 6
  3. sqlc:検索条件が増えると、SQLも複雑になる 例:ユーザー検索の画面 role:すべて / admin / member active:すべて / 有効

    / 無効 次は名前や登録日でも絞りたい 入力がない項目では、絞り込まない。 任意条件をどう書く? WHERE ($1::text IS NULL OR role = $1) 1本のSQLなら、条件を無効にする分岐 が増える。 SQLを分けるなら、条件の組み合わせを 管理する。 https://docs.sqlc.dev/en/latest/howto/named_parameters.html 7
  4. Bobは、型を生成してから条件を組み立てられる DBスキーマ 手書きSQL → → モデルを生成 User / UserSetter 関数と結果の型を

    生成 → → 生成した型で 検索・更新 With()で 検索条件を追加 どちらから始めても、Goで条件を追加できる。 SQLの組み立てを支えるのがQuery Builder。単体でも使える。 https://bob.stephenafamo.com/docs/code-generation/intro/ https://bob.stephenafamo.com/docs/code-generation/queries/ 10
  5. Userは読む型、UserSetterは書く型 型 表せる状態 使う場所 null.Val[T] NULL / 値 UserのNULL許容列 omit.Val[T]

    未指定 / 値 UserSetterのNOT NULL列 omitnull.Val[T] 未指定 / NULL / 値 UserSetterのNULL許容列 https://github.com/aarondl/opt https://bob.stephenafamo.com/docs/code-generation/usage/ 16
  6. UPDATE:false・NULL・未指定を分けて書く Active → false Nickname → NULL Name・Role → 変更しない

    INSERTと同じSetter。 https://bob.stephenafamo.com/docs/code-generation/usage/ https://github.com/aarondl/opt 18
  7. sqlcで悩みやすいのは、条件が増える検索 例:ユーザー検索画面 sqlcの出発点 roleを指定したときだけ絞る SQLファイルを先に書く activeは未指定 / true / false

    クエリごとにGoの関数ができる 並び順やページサイズも変える 条件の組み合わせをSQL側で表す https://docs.sqlc.dev/en/latest/tutorials/getting-started-postgresql.html https://docs.sqlc.dev/en/latest/howto/named_parameters.html 21
  8. 補足:Query Builderだけでも使える SELECT / FROM / WHEREをGo で組み立てる。 値はArg()で渡す。 この書き方だけでは、列の存在

    や値の型までは検査しない。 https://bob.stephenafamo.com/docs/query-builder/principles/ https://bob.stephenafamo.com/docs/query-builder/ 39
  9. 補足:動くサンプルと確認範囲 Bob v0.50.0 / PostgreSQL / Go 1.26.4 SELECT・AND/OR・動的条件・With()・INSERT・UPDATE・DELETE RunInTx:コミット/ロールバックと、Executorの共通化

    demo-postgres/README.mdに実行・再生成の手順 公式仕様の再確認:2026年10月8日 https://github.com/stephenafamo/bob/releases/tag/v0.50.0 https://bob.stephenafamo.com/docs/code-generation/psql/ 42
  10. 補足:公式資料 SQLBoiler:README / Bobとの比較 Bob:Code Generation / Usage / Queries

    / opt GORM:Update / Gen Query / Generics API sqlc:PostgreSQL tutorial / Naming parameters トランザクション:Bob v0.50.0のstdlib.go 43