Сохранить все поля
Save
сохранит все поля при выполнении SQL
db.First(&user) |
Save
- это комбинированная функция. Если сохраняемое значение не содержит первичного ключа, оно выполнит Create
, в противном случае оно выполнит Update
(со всеми полями).
db.Save(&User{Name: "jinzhu", Age: 100}) |
ПРИМЕЧАНИЕ Не используйте
Save
сModel
, это Неопределенное поведение.
Обновление одного столбца
При обновлении одного столбца с помощью Update
для него должны быть какие-либо условия, иначе возникнет ошибка ErrMissingWhereClause
, проверьте Блокировка глобальных обновлений для получения подробной информации. При использовании Model
метод и его значение имеет первичное значение, первичный ключ будет использоваться для построения условия, например:
// Обновление с условием |
Обновление нескольких столбцов
Updates
поддерживает обновление с помощью struct
или map[string]interface{}
, при обновлении с помощью struct
по умолчанию обновляются только ненулевые поля
// Обновление атрибутов с помощью `struct`, обновятся только ненулевые поля |
ПРИМЕЧАНИЕ При обновлении с помощью struct GORM обновит только ненулевые поля. Возможно, вы захотите использовать
map
для обновления атрибутов или использоватьSelect
для указания полей для обновления
Обновить выбранные поля
Если вы хотите обновить выбранные поля или проигнорировать некоторые поля при обновлении, вы можете использовать Select
, Omit
// Выбрать c Map |
Хуки Update
GORM поддерживает хуки BeforeSave
, BeforeUpdate
, AfterSave
, AfterUpdate
. Эти методы будут вызываться при обновлении записи, смотрите Хуки для получения подробной информации
func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { |
Updates пакетами
Если мы не указали запись, имеющую значение первичного ключа с помощью Model
, GORM выполнит пакетное обновление
// Обновление со структурой |
Глобальные блокировки при Updates
Если вы выполните пакетное обновление без каких-либо условий, GORM НЕ запустит его и вернет ошибку ErrMissingWhereClause
по умолчанию
Вы должны использовать некоторые условия, или использовать необработанный SQL, или включить режим AllowGlobalUpdate
, например:
db.Model(&User{}).Update("name", "jinzhu").Error // gorm.ErrMissingWhereClause |
Количество обновленных записей
Получить количество строк, затронутых обновлением
// Получить количество обновленных записей с помощью `RowsAffected` |
Расширенный Update
Обновление с помощью SQL выражения
GORM позволяет обновлять столбец с помощью SQL-выражения, например:
// ID продукта равен `3` |
И GORM также позволяет обновлять записи с помощью SQL-выражений/контектстного значения используя Настраиваемые типы данных, например:
// Создать на основе собственного типа данных |
Update с помощью подзапроса
Обновление таблицы при помощи подзапроса
db.Model(&user).Update("company_name", db.Model(&Company{}).Select("name").Where("companies.id = users.company_id")) |
Без использования хуков/отслеживания времени
Если вы хотите пропустить хуки
и не отслеживать время обновления при обновлении, вы можете использовать UpdateColumn
, UpdateColumns
, это работает как Update
, Updates
// Обновить одну колонку |
Возврат данных из измененных строк
Возврат измененных данных работает только для баз данных, которые поддерживают возврат, например:
// Возвратить все колонки |
Проверка, изменилось ли поле?
GORM предоставляет метод Changed
, который можно было бы использовать в Before Updates Hooks, он сообщит, изменилось поле или нет.
Метод Changed
работает только с методами Update
, Updates
, и он проверяет только, соответствует ли значение обновления из Update
/ Updates
значению значение модели. Он вернет значение true, если оно изменено, а не опущено
func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { |
Изменение обновляемых данных
Чтобы изменить обновляемые значения в Before Hooks, вы должны использовать SetColumn
, если только это не полное обновление с Save
, например:
func (user *User) BeforeSave(tx *gorm.DB) (err error) { |