Gorm -- 修改记录

更新单个字段

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

猜你喜欢

转载自blog.csdn.net/qq_40096897/article/details/129489201