Получение одного объекта
GORM предоставляет методы First, Take, Last для получения одного объекта из базы данных. Эти методы добавляют условие LIMIT 1 при запросе к базе данных, но если запись не найдена, вернется ошибка ErrRecordNotFound.
Generics API
ctx := context.Background() |
Traditional API
// Получение первой записи при сортировке по первичному ключу "id" |
Если вы хотите избежать ошибки
ErrRecordNotFound, используйте методFind, напримерdb.Limit(1).Find(&user), методFindпринимает как структурные, так и срезанные данные
Using
Findwithout a limit for single objectdb.Find(&user)will query the full table and return only the first object which is non-deterministic and not performant
Методы First и Last найдут первую и последнюю запись (соответственно) в порядке, установленном первичным ключом. Они работают только тогда, когда указатель на целевую структуру передается методам в качестве аргумента или когда модель указана с помощью db.Model(). Кроме того, если для соответствующей модели не определен первичный ключ, то модель будет упорядочена по первому полю. Например:
var user User |
Получение объектов по первичному ключу
Объекты могут быть извлечены с использованием первичного ключа с помощью Встроенных условий, если первичным ключом является число. При работе со строками необходимо соблюдать особую осторожность, чтобы избежать SQL-инъекции; ознакомьтесь с Раздел “Безопасность” для получения подробной информации.
Generics API
ctx := context.Background() |
Traditional API
db.First(&user, 10) |
Если первичным ключом является строка (например, как uuid), запрос будет записан следующим образом:
db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a") |
Когда целевой объект имеет первичное значение, первичный ключ будет использоваться для построения условия, например:
var user = User{ID: 10} |
NOTE: If you use gorm’s specific field types like
gorm.DeletedAt, it will run a different query for retrieving object/s.
type User struct { |
Получение всех объектов
// Get all records |
Условия
Строковые условия
// Get first matched record |
If the object’s primary key has been set, then condition query wouldn’t cover the value of primary key but use it as a ‘and’ condition. For example:
var user = User{ID: 10}
db.Where("id = ?", 20).First(&user)
// SELECT * FROM users WHERE id = 10 and id = 20 ORDER BY id ASC LIMIT 1This query would give
record not foundError. So set the primary key attribute such asidto nil before you want to use the variable such asuserto get new value from database.
Условия в структурах и картах
// Struct |
NOTE When querying with struct, GORM will only query with non-zero fields, that means if your field’s value is
0,'',falseor other zero values, it won’t be used to build query conditions, for example:
db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users) |
To include zero values in the query conditions, you can use a map, which will include all key-values as query conditions, for example:
db.Where(map[string]interface{}{"Name": "jinzhu", "Age": 0}).Find(&users) |
For more details, see Specify Struct search fields.
Указание полей поиска для структуры
When searching with struct, you can specify which particular values from the struct to use in the query conditions by passing in the relevant field name or the dbname to Where(), for example:
db.Where(&User{Name: "jinzhu"}, "name", "Age").Find(&users) |
Встроенное условие
Query conditions can be inlined into methods like First and Find in a similar way to Where.
// Get by primary key if it were a non-integer type |
Условие Not
Build NOT conditions, works similar to Where
db.Not("name = ?", "jinzhu").First(&user) |
Условие Or
db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users) |
For more complicated SQL queries. please also refer to Group Conditions in Advanced Query.
Выбор определенных полей
Select allows you to specify the fields that you want to retrieve from database. Otherwise, GORM will select all fields by default.
db.Select("name", "age").Find(&users) |
Also check out Smart Select Fields
Порядок сортировки Order
Specify order when retrieving records from the database
db.Order("age desc, name").Find(&users) |
Limit и Offset
Limit specify the max number of records to retrieve Offset specify the number of records to skip before starting to return the records
db.Limit(3).Find(&users) |
Refer to Pagination for details on how to make a paginator
Group и Having
type result struct { |
Distinct
Selecting distinct values from the model
db.Distinct("name", "age").Order("name, age desc").Find(&results) |
Distinct works with Pluck and Count too
Joins
Specify Joins conditions
type result struct { |
Joins с предварительной загрузкой
You can use Joins eager loading associations with a single SQL, for example:
db.Joins("Company").Find(&users) |
Join with conditions
db.Joins("Company", db.Where(&Company{Alive: true})).Find(&users) |
For more details, please refer to Preloading (Eager Loading).
Joins к производной таблице
You can also use Joins to join a derived table.
type User struct { |
Scan
Scanning results into a struct works similarly to the way we use Find
type Result struct { |