Каталог статей
-
- обновить одно поле
- Массовое обновление полей
-
- Измените другие поля в соответствии с первичным ключом класса сущности.
- Укажите идентификатор для изменения других полей (класс объекта модели)
- Укажите ID для изменения других полей (словарь)
- Укажите значение поля, которое необходимо изменить
- Значения поля щита, которые не нужно изменять
- Используйте функцию хука
- Полное обновление таблицы
- Пользовательский SQL с использованием EXEC
- Используйте выражения SQL
обновить одно поле
user := &model.User{
Id: 5511,
Name: "测试goper",
Age: 10,
}
Изменить информацию строки по идентификатору
Использование модели (пользователя) GORM по умолчанию изменит информацию о строке запроса в пользователе .
db.Debug().Model(user).UpdateColumn("name", "测试修改")
----------------------------
UPDATE `user` SET `name`='测试goper',`age`=10 WHERE `id` = 5511
Изменить записи в соответствии с условиями запроса
db.Debug().Model(&model.User{
}).Where("name = ?","测试goper").Update("name", "测试修改")
-------------------------------
UPDATE `user` SET `name`='重置了姓名',`name`='测试修改' WHERE name = '测试goper'
Массовое обновление полей
Измените другие поля в соответствии с первичным ключом класса сущности.
Измените поля, назначенные в классе сущностей.
result := db.Debug().Updates(&user)
if result.Error != nil {
fmt.Println(result.Error)
}
-------------------------------------
UPDATE `user` SET `name`='测试goper',`age`=10 WHERE `id` = 5511
Укажите идентификатор для изменения других полей (класс объекта модели)
Следует отметить, что если вы используете класс сущности модели для обновления поля, поле должно быть ненулевым, иначе поле не будет обновлено.
db.Debug().Model(user).Updates(model.User{
InfantName: "ceshi2", Age: 18})
db.Debug().Model(user).Updates(model.User{
InfantName: "ceshi2", Age: 0})
---------------------------------
UPDATE `user` SET `infant_name`='ceshi2',`age`=18 WHERE `id` = 5511
UPDATE `user` SET `infant_name`='ceshi2' WHERE `id` = 5511
Укажите ID для изменения других полей (словарь)
Измените информацию о строке в виде словаря, не беспокоясь о ненулевых значениях.
db.Debug().Model(user).Updates(map[string]interface{
}{
"name": "批量修改", "age": 20})
db.Debug().Model(user).Updates(map[string]interface{
}{
"name": "批量修改", "age": 0})
-----------------------------
UPDATE `user` SET `age`=20,`name`='批量修改' WHERE `id` = 5511
UPDATE `user` SET `age`=0,`name`='批量修改' WHERE `id` = 5511
Укажите значение поля, которое необходимо изменить
Первая строка изменяет только поле имени, а второй абзац изменяет поля имени и возраста.
db.Debug().Model(user).Select("name").Updates(model.User{
Name: "ceshi2", Age: 18})
db.Debug().Model(user).Select("name", "age").Updates(map[string]interface{
}{
"name": "ceshi2", "age": 0})
----------------------------
UPDATE `user` SET `name`='ceshi2' WHERE `id` = 5511
UPDATE `user` SET `age`=0,`name`='批量修改' WHERE `id` = 5511
Значения поля щита, которые не нужно изменять
Не изменять поле имени
db.Debug().Model(user).Omit("name").Updates(model.User{
Name: "ceshi2", Age: 18})
db.Debug().Model(user).Omit("name").Updates(map[string]interface{
}{
"name": "批量修改", "age": 0})
------------------------------
UPDATE `user` SET `age`=18 WHERE `id` = 5511
UPDATE `user` SET `age`=0 WHERE `id` = 5511
Используйте функцию хука
Порядок выполнения функции хука
Перед сохранением - Перед обновлением - После обновления - После сохранения
Используйте BeforUpdate для проверки модификации
Изменить пользователя модели
func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
// u.UserDesc = "使用钩子函数更新了一个属性"
// return
if tx.Statement.Changed("Name") {
fmt.Println("修改了姓名")
}
if tx.Statement.Changed("Name", "UserDesc") {
fmt.Println("修改了姓名或用户描述")
}
if tx.Statement.Changed() {
fmt.Println("修改了任意信息")
}
return nil
}
db.Debug().Model(user).Update("name", "测试修改")
----------------
修改了姓名
UPDATE `user` SET `name`='测试修改' WHERE `id` = 5511
нет функции хука
Обновление с использованием UpdateColumn и UpdateColumns.
Следует отметить, что после того, как мы используем UpdateColumn для модификации, значения полей в классе сущности модели также будут обновлены. Таким образом, имя во втором измененном содержимом ниже также является «измененным именем».
db.Debug().Model(user).UpdateColumn("name", "修改姓名")
db.Debug().UpdateColumns(user)
----------------------------------
UPDATE `user` SET `name`='修改姓名' WHERE `id` = 5511
UPDATE `user` SET `name`='修改姓名',`age`=10 WHERE `id` = 5511
Полное обновление таблицы
Укажите имя таблицы напрямую или используйте пустой класс сущности модели пользователя,
db.Debug().Table("user").Where("1=1").Updates(map[string]interface{
}{
"name": "Test2",
})
db.Debug().Model(&model.User{
}).Where("1=1").Updates(&model.User{
Name: "Test",
})
----------------------------
UPDATE `user` SET `name`='Test2'
UPDATE `user` SET `name`='Test'
Полное обновление таблицы должно иметь условие where, в противном случае будет сообщено об ошибке, а условие Missing Where отсутствует, потому что gorm не разрешает полное обновление таблицы по умолчанию
или добавляет Session AllowGlobalUpdate: true
db.Debug().Table("user").Session(&gorm.Session{
AllowGlobalUpdate: true}).Updates(map[string]interface{
}{
"name": "Test5",
})
--------------------------------
UPDATE `user` SET `name`='Test5'
Пользовательский SQL с использованием EXEC
db.Debug().Exec("UPDATE user SET name = ?", "Test4")
------------------------
UPDATE user SET name = 'Test4'
Используйте выражения SQL
используйте горм.Выражение("")
db.Debug().Table("user").Where("id = ?", 521).Updates(map[string]interface{
}{
"name": gorm.Expr("concat('SQL','表达式')")})
------------------------------
UPDATE `user` SET `name`=concat('SQL','表达式') WHERE id = 521