bob vs sqlboiler
https://scrapbox.io/files/689bd07b692be3d8cf7395ec.png
主要機能のBob→SQLBoiler(dbmodels)具体例
code:1. 全件取得.go
1. 全件取得
// Bob
dbmodels.Lots.Query().All(ctx, db)
// SQLBoiler(dbmodels)
dbmodels.Lots().All(ctx, db)
code:go
2. 主キー取得
// Bob
dbmodels.FindLot(ctx, db, 123)
// SQLBoiler(dbmodels)
dbmodels.FindLot(ctx, db, 123)
code:go
3. 条件付き検索(AND)
// Bob
dbmodels.Lots.Query(
dbmodels.SelectWhere.Lots.ID.EQ(1),
dbmodels.SelectWhere.Lots.Code.EQ("foo"),
).All(ctx, db)
// SQLBoiler(dbmodels)
dbmodels.Lots(
dbmodels.LotWhere.ID.EQ(1),
dbmodels.LotWhere.Code.EQ("foo"),
).All(ctx, db)
code:go
4. 条件付き検索(OR)
// Bob
dbmodels.Lots.Query(sm.Where(psql.Raw("id=? OR code=?", 1, "foo"))).All(ctx, db)
// SQLBoiler(dbmodels)
dbmodels.Lots(
qm.Expr(
dbmodels.LotWhere.ID.EQ(1),
qm.Or2(dbmodels.LotWhere.Code.EQ("foo")),
),
).All(ctx, db)
code:go
5. LIMIT / OFFSET
// --- Bob ---
dbmodels.Lots.Query(
sm.Limit(10),
sm.Offset(5),
).All(ctx, db)
// --- SQLBoiler(dbmodels) ---
dbmodels.Lots(
qm.Limit(10),
qm.Offset(5),
).All(ctx, db)
code:go
6. JOIN(手動結合)
// --- Bob ---
dbmodels.Lots.Query(
sm.InnerJoin("stores").On(
psql.Raw("stores.id = lots.store_id"),
),
).All(ctx, db)
// --- SQLBoiler(dbmodels) ---
dbmodels.Lots(
qm.InnerJoin("stores on stores.id = lots.store_id"),
).All(ctx, db)
解説: Bobは sm.InnerJoin().On()、SQLBoilerは qm.InnerJoin("... on ...")。
code:go
7. Preload(関連一括取得)
// --- Bob ---
dbmodels.Lots.Query(
dbmodels.Preload.Lot.Store(),
).All(ctx, db)
// --- SQLBoiler(dbmodels) ---
dbmodels.Lots(
qm.Load(dbmodels.LotRels.Store),
).All(ctx, db)
解説: PreloadはBobがPreload.Lot.Store()、SQLBoilerはqm.Load(LotRels.Store)。
code:go
8. LIMIT / OFFSET
// --- Bob ---
dbmodels.Lots.Query(
sm.Limit(10),
sm.Offset(5),
).All(ctx, db)
// --- SQLBoiler(dbmodels) ---
dbmodels.Lots(
qm.Limit(10),
qm.Offset(5),
).All(ctx, db)
解説: 名前がsm.→qm.に変わるだけ。
code:go
9. ORDER BY
// --- Bob ---
dbmodels.Lots.Query(
sm.OrderBy("created_at DESC"),
).All(ctx, db)
// --- SQLBoiler(dbmodels) ---
dbmodels.Lots(
qm.OrderBy(dbmodels.LotColumns.CreatedAt + " DESC"),
).All(ctx, db)
解説: 安全にするならSQLBoilerはカラム定数+文字列結合。
code:go
10. カラム指定(SELECT)
// --- Bob ---
dbmodels.Lots.Query(
sm.Columns("id", "code"),
).All(ctx, db)
// --- SQLBoiler(dbmodels) ---
dbmodels.Lots(
qm.Select(dbmodels.LotColumns.ID, dbmodels.LotColumns.Code),
).All(ctx, db)
解説: Bobは文字列でカラム指定、SQLBoilerはカラム定数を使う。
code:go
11. COUNT
// --- Bob ---
count, err := dbmodels.Lots.Query().Count(ctx, db)
// --- SQLBoiler(dbmodels) ---
count, err := dbmodels.Lots().Count(ctx, db)
code:go
12. EXISTS
// --- Bob ---
exists, err := dbmodels.Lots.Query(
dbmodels.SelectWhere.Lots.ID.EQ(1),
).Exists(ctx, db)
// --- SQLBoiler(dbmodels) ---
exists, err := dbmodels.Lots(
dbmodels.LotWhere.ID.EQ(1),
).Exists(ctx, db)
解説: SelectWhere -> LotWhere の違いのみ。
code:go
13. UPDATE
// --- Bob ---
lot.Update(ctx, db, db.DefaultBlackList)
// --- SQLBoiler(dbmodels) ---
lot.Update(ctx, db, boil.Infer())
解説: 更新禁止カラム指定方法が違う(BobはBlacklist、SQLBoilerはInfer)。
code:go
14. DELETE
// --- Bob ---
dbmodels.Lots.Query(
dbmodels.SelectWhere.Lots.ID.EQ(10),
).DeleteAll(ctx, db)
// --- SQLBoiler(dbmodels) ---
dbmodels.Lots(
dbmodels.LotWhere.ID.EQ(10),
).DeleteAll(ctx, db)
解説: 条件指定が SelectWhere → LotWhere。
code:go
15. 個別リレーション読み込み(LoadXxx)
// --- Bob ---
lot.LoadStore(ctx, db)
fmt.Println(lot.R.Store.Name)
// --- SQLBoiler(dbmodels) ---
lot.L.LoadStore(ctx, db, true, lot, nil)
fmt.Println(lot.R.Store.Name)
解説: SQLBoilerは.L.Load◯◯() 形式で、最後にtrue指定で単体ロード。