Raw SQL
Scan
を使用して素のSQLでレコードを取得することができます。
type Result struct { |
素のSQLで Exec
を実行することも可能です。
db.Exec("DROP TABLE users") |
注 GORMはパフォーマンスを向上のためにプリペアードステートメントをキャッシュすることができます。詳細は Performance を参照してください。
名前付き引数
GORMは sql.NamedArg
や map[string]interface{}{}
、構造体を使用した名前付き引数をサポートしています。例:
db.Where("name1 = @name OR name2 = @name", sql.Named("name", "jinzhu")).Find(&user) |
DryRun Mode
実行せずに、SQL
とその引数の生成だけを行います。生成されたSQLの確認やテストを行えます。詳細についてはSession を確認してください。
stmt := db.Session(&gorm.Session{DryRun: true}).First(&user, 1).Statement |
ToSQL
実行はせずに、生成された SQL
を返します。
GORMはSQL文を構築するために database/sql のプレースホルダ引数を使用します。これにより、引数を自動的にエスケープし、SQLインジェクションを防ぐことができます。 しかし、生成されたSQLが安全であるという保証はしていないため、デバッグにのみ使用するようにしてください。
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB { |
Row
& Rows
結果を *sql.Row
として取得します。
// GORMのAPIを利用 |
結果を *sql.Rows
として取得します。
// SQLの組み立てにGORM APIを使用 |
バッチ処理でのレコード取得やレコード処理の方法については、FindInBatches を参照してください。また、複雑なSQLクエリの構築方法については、Group Conditions を参照してください。
*sql.Rows
を構造体へ Scan
ScanRows
を使用して、取得した行データを構造体にScanすることができます。例:
rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error) |
Connection
同じtcp接続で複数のSQLを実行することができます(トランザクションを意味するものではありません)
db.Connection(func(tx *gorm.DB) error { |
高度な機能
Clauses
GORMは内部的にSQLビルダーを使用してSQLを生成します。各操作に対し、GORMは *gorm.Statement
オブジェクトを作成し、すべてのGORM APIで Statement
にClause
を追加/変更し、最終的にこれらの Clause
にもとづいてSQLを生成します。
例えば First
でレコードを取得する場合、First
は内部的に、以下の Clauses
を Statement
に追加します。
var limit = 1 |
その後、GORMは Query
コールバックで最終的に実行されるSQLクエリを組み立てます。
Statement.Build("SELECT", "FROM", "WHERE", "GROUP BY", "ORDER BY", "LIMIT", "FOR") |
生成されるSQLは以下のようになります。
SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1 |
独自の Clause
を定義して、それを利用することも可能です。その際は Interface を実装する必要があります。
詳細については examples を参照してください。
Clause Builder
データベースの種別に応じて、Clausesはそれぞれ異なるSQLを生成します。例:
db.Offset(10).Limit(5).Find(&users) |
データベースドライバがClause Builderを登録することで、デフォルトのものを置き換えることが可能になっているため、これが可能となっています。 例として Limit を参照してみるとよいでしょう。
Clause Options
GORMは 多くのClauses を定義しています。いくつかのClausesは高度なオプションを提供し、アプリケーションで使用することができます。
ほとんど使われることはないかもしれませんが、もしGORMのAPIがアプリケーションの要求にマッチしない場合は、それらを調べてみてもよいでしょう。例:
db.Clauses(clause.Insert{Modifier: "IGNORE"}).Create(&user) |
StatementModifier
GORMは StatementModifier インターフェイスを提供しており、これを利用することでアプリケーションの要求に合うようにstatementを修正することが可能になります。例として Hints を参照するとよいでしょう。
import "gorm.io/hints" |