メソッドチェーン
Gormはメソッドチェーンのインタフェースを実装しているため、このようなコードを書くことができます:
db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable") |
クエリは即時メソッドまで生成されず、それはいくつかの場面で有効です。
共通ロジックを扱うためのラッパーへ抽出するといったような場面で。
即時メソッド
即時メソッドはSQLクエリを生成してデータベースに送信するメソッドのことです。たいていはCRUDメソッドのことであり、
Create
, First
, Find
, Take
, Save
, UpdateXXX
, Delete
, Scan
, Row
, Rows
… 等を指します。
上記チェーンに基づく即時メソッドの例を示します:
tx.Find(&user) |
は
SELECT * FROM users where name = 'jinzhu' AND age = 30 AND active = 1; |
スコープ
スコープはメソッドチェーンの理論に基づいて構築されます。
これにより、汎用ロジックへの抽出が可能になり、より再利用しやすいライブラリを記述することができます。
func AmountGreaterThan1000(db *gorm.DB) *gorm.DB { |
複数の即時メソッド
GORMで複数の即時メソッドを扱う場合、後方の即時メソッドは前方の即時メソッドのクエリ条件を再利用します(インライン条件は除きます)
db.Where("name LIKE ?", "jinzhu%").Find(&users, "id IN (?)", []int{1, 2, 3}).Count(&count) |
生成
SELECT * FROM users WHERE name LIKE 'jinzhu%' AND id IN (1, 2, 3) |
スレッドセーフ
全てのチェーンメソッドは複製され新規DBオブジェクトを作成します(1つのコネクションプールを共有します)。GORMは複数のgoroutineでの並行利用に対して安全です。