gorm更新指定的字段

作者: adm 分类: mysql 发布时间: 2023-08-21

gorm更新选定字段,经过一系列的测试,终于搞懂了,觉得不注意还是很容易掉进坑里的

Save 会保存所有的字段,即使字段是零值,但如果保存值不包含主键,它将执行Create,

db.First(&user)

user.Name = "jinzhu 2"
user.Age = 100
db.Save(&user)
// UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111;
保存是一个组合功能。如果保存值不包含主键,它将执行Create,否则它将执行Update(使用所有字段),如果用save 必须传入主键,否则就会新增数据。
如果使用save更新,必须先查询或者传入的值包含所有的字段,切勿传入单个字段更新,那样update里面没有更新的字段值会被清空

Updates
Updates支持使用struct或map[string]interface{}进行更新,当使用struct进行更新时,默认情况下只更新非零字段,如果struct更新非0字段,必须加上select或者将该字段设置为指针
// Select with Map
// User's ID is `111`:
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello' WHERE id=111;

db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

// Select with Struct (select zero value fields)
select + struct更新, 会更新零值的字段
db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
// UPDATE users SET name='new_name', age=0 WHERE id=111;

// Omit + struct更新, 不会更新零值的字段 Age=0不会执行
db.Debug().Model(&User{}).Where(map[string]interface{}{"id": 7}).Omit("name").Updates(User{
   Name: sql.NullString{"struct2", true},
   Age: 0,
})
// 此语句不执行

// Select("*")会更新所有字段,但update里面没有更新的字段值会被清空
db.Model(&user).Select("*").Updates(User{Name: "jinzhu", Role: "admin", Age: 0})

// Select all fields but omit Role (select all fields include zero value fields)
db.Model(&user).Select("*").Omit("Role").Updates(User{Name: "jinzhu", Role: "admin", Age: 0})

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!