文章目录
更新单个字段
user := &model.User{
Id: 5511,
Name: "测试goper",
Age: 10,
}
按照ID修改行信息
使用 Model(user) GORM 会默认将 user 中的查询行信息并做修改。
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
指定 ID 修改其他字段(模型实体类)
要注意的是,如果使用模型实体类的方式去更新字段,该字段需要时非零值,否则不会更新该字段
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
指定需要修改的字段值
第一行只修改 name 字段,第二段修改 name 和 age 字段
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
屏蔽不需要修改的字段值
不修改 name 字段
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
使用钩子函数
钩子函数执行顺序
BeforeSave - BeforeUpdate - AfterUpdate - AfterSave
使用 BeforUpdate 对修改进行检验
修改模型 user
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修改之后,模型实体类中的字段值也会发生更新。所以下面第二条修改内容中的 name 也是 ‘修改姓名’
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
全表更新
直接指定表名字或者使用一个空的User模型实体类,
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条件否则会报错缺少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'
使用EXEC自定义SQL
db.Debug().Exec("UPDATE user SET name = ?", "Test4")
------------------------
UPDATE user SET name = 'Test4'
使用SQL表达式
使用 gorm.Expr(“”)
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