今日Goでコード書いてて、データベースから条件検索するときにつまづいたのでメモ。
squirrelライブラリとは
squirrelはGo言語でSQLを組み立てるためのライブラリ。生のSQLを書くよりも型安全に書けるので便利。
import "github.com/Masterminds/squirrel"
色々な比較演算子
Gt - Greater Than (より大きい)
Gt
は「Greater Than」の略で、SQLの「>」演算子に相当します。「より大きい」という条件を表します。
// IDが100より大きいレコードを取得
users := squirrel.Select("id", "name").
From("users").
Where(squirrel.Gt{
"id": 100,
})
GtOrEq - Greater Than or Equal (以上)
GtOrEq
は「Greater Than or Equal」の略で、SQLの「>=」のこと。「以上」って意味。
// created_atが7日前以降のデータを取る
users := squirrel.Select("id", "name").
From("users").
Where(squirrel.GtOrEq{
"created_at": time.Now().AddDate(0, 0, -7),
})
Lt - Less Than (より小さい)
Lt
は「Less Than」の略で、SQLの「<」演算子に相当します。「より小さい」という条件を表します。
// 価格が1000円より小さい商品を取得
items := squirrel.Select("id", "name").
From("items").
Where(squirrel.Lt{
"price": 1000,
})
LtOrEq - Less Than or Equal (以下)
LtOrEq
は「Less Than or Equal」の略で、SQLの「<=」のこと。「以下」って意味。
// 値段が1000円以下の商品を取る
items := squirrel.Select("id", "name").
From("items").
Where(squirrel.LtOrEq{
"price": 1000,
})
複数条件を組み合わせる
両方使って範囲検索みたいなことをやりたいときは、And{}
を使って組み合わせる。
// 値段が100円以上500円以下の商品
items := sq.Select("*").
From("items").
Where(sq.And{
sq.GtOrEq{"price": 100},
sq.LtOrEq{"price": 500},
})
他の条件と組み合わせることもできる:
// 会社IDが3で、作成日が1週間以内のユーザー
users := squirrel.Select("*").
From("users").
Where("company_id = ?", 3).
Where(squirrel.GtOrEq{
"created_at": time.Now().AddDate(0, 0, -7),
})
注意点
- BETWEENを直接書けない(上の例みたいにAnd{}とGtOrEq/LtOrEqを使うか、Expr()で直接SQLを書く)
- 値がnilのときはIS NULL/IS NOT NULLになるので注意
- 配列を渡すとIN句になる
まとめ
squirrelを使うとSQLを安全に書けて便利。GtOrEqとLtOrEqは「以上」「以下」の条件を書くときに使う。複数条件はAnd{}やOr{}で組み合わせる。