Чистый SQL
Запрос сырых SQL с помощью Scan
type Result struct { |
Exec
с помощью сырого SQL
db.Exec("DROP TABLE users") |
ПРИМЕЧАНИЕ GORM позволяет кэшировать подготовленные операторы для повышения производительности, подробности смотрите в Производительность
Именованные аргументы
GORM поддерживает именованные аргументы с помощью sql.NamedArg
, map[string]interface{}{}
или структуры, например:
db.Where("name1 = @name OR name2 = @name", sql.Named("name", "jinzhu")).Find(&user) |
Режим DryRun
Генерировать SQL
и его аргументы без выполнения, может быть использовано для подготовки или тестирования сгенерированного SQL. Смотрите Сессии для деталей
stmt := db.Session(&gorm.Session{DryRun: true}).First(&user, 1).Statement |
ToSQL
Возвращает сгенерированный SQL
без выполнения.
GORM использует плейсхолдеры аргументов базы данных/sql для построения запроса SQL, которые автоматически защищают от инъекций SQL, но сгенерированный SQL не предоставляет гарантий безопасности. Пожалуйста, используйте его только для отладки.
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB { |
Row
и Rows
Получение *sql.Row
в результате запроса
// Использование GORM API для построения SQL |
Получение *sql.Rows
в результате запроса
// Использование GORM API для построения SQL |
Посмотрите FindInBatches, как запрашивать и обрабатывать записи пакетом. Ознакомьтесь с Группировка условий для создания сложных SQL запросов
Сканирование *sql.Rows
в структуру
Используйте ScanRows
, чтобы отсканировать строку в структуру, например:
rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error) |
Connection
Run mutliple SQL in same db tcp connection (not in a transaction)
db.Connection(func(tx *gorm.DB) error { |
Advanced
Clauses
GORM uses SQL builder generates SQL internally, for each operation, GORM creates a *gorm.Statement
object, all GORM APIs add/change Clause
for the Statement
, at last, GORM generated SQL based on those clauses
For example, when querying with First
, it adds the following clauses to the Statement
var limit = 1 |
Then GORM build finally querying SQL in the Query
callbacks like:
Statement.Build("SELECT", "FROM", "WHERE", "GROUP BY", "ORDER BY", "LIMIT", "FOR") |
Which generate SQL:
SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1 |
You can define your own Clause
and use it with GORM, it needs to implements Interface
Check out examples for reference
Построитель операторов
For different databases, Clauses may generate different SQL, for example:
db.Offset(10).Limit(5).Find(&users) |
Which is supported because GORM allows database driver register Clause Builder to replace the default one, take the Limit as example
Варианты операторов
GORM defined Many Clauses, and some clauses provide advanced options can be used for your application
Although most of them are rarely used, if you find GORM public API can’t match your requirements, may be good to check them out, for example:
db.Clauses(clause.Insert{Modifier: "IGNORE"}).Create(&user) |
StatementModifier
GORM provides interface StatementModifier allows you modify statement to match your requirements, take Hints as example
import "gorm.io/hints" |