Получение одного объекта
GORM предоставляет методы First
, Take
, Last
для получения одного объекта из базы данных. Эти методы добавляют условие LIMIT 1
при запросе к базе данных, но если запись не найдена, вернется ошибка ErrRecordNotFound
.
// Получение первой записи при сортировке по первичному ключу "id" |
Если вы хотите избежать ошибки
ErrRecordNotFound
, используйте методFind
, напримерdb.Limit(1).Find(&user)
, методFind
принимает как структурные, так и срезанные данные
Использование
Find
без лимита для одного объектаdb.Find(&user)
запросит полную таблицу и вернет только первый объект, который не является исполнительным и недетерминированным
Методы First
и Last
найдут первую и последнюю запись (соответственно) в порядке, установленном первичным ключом. Они работают только тогда, когда указатель на целевую структуру передается методам в качестве аргумента или когда модель указана с помощью db.Model()
. Кроме того, если для соответствующей модели не определен первичный ключ, то модель будет упорядочена по первому полю. Например:
var user User |
Получение объектов по первичному ключу
Объекты могут быть извлечены с использованием первичного ключа с помощью Встроенных условий, если первичным ключом является число. При работе со строками необходимо соблюдать особую осторожность, чтобы избежать SQL-инъекции; ознакомьтесь с Раздел “Безопасность” для получения подробной информации.
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 found
Error. So set the primary key attribute such asid
to nil before you want to use the variable such asuser
to 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
,''
,false
or 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 { |