gorm更新指定的字段
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})

