gorm中的更新


保存所有字段

  Save 会保存所有的字段,即使字段是零值、

db.First(&user, 5)
user.Name = sql.NullString{"王八", true}
user.Age = 9
db.Debug().Save(&user)
// UPDATE `users` SET `name`='王八',`age`=9,`uuid`='c3987500-bf01-412b-aaab-685285e04037',`created_at`='2021-11-17 13:34:30' WHERE `id` = 5

更新单个列

  当使用 Update 更新单个列时,你需要指定条件,否则会返回 ErrMissingWhereClause 错误,查看 Block Global Updates 获取详情。当使用了 Model 方法,且该对象主键有值,该值会被用于构建条件,例如:

db.Debug().Model(&User{}).Where("age = ?", 12).Update("name", "张无忌")
// UPDATE `users` SET `name`='张无忌' WHERE age = 12

var user User
db.First(&user, "age = ?", 9)
db.Debug().Model(&user).Update("name", "龟")
// UPDATE `users` SET `name`='龟' WHERE `id` = 5 // 由于user对象主键有值,所以就会被用于构建条件

更新多列

  Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段

// 根据struct更新属性,只会更新非零值字段
var user User
db.First(&user, 7)
db.Debug().Model(&user).Updates(User{Name: sql.NullString{"哈哈2", true}, Age: 0})
// UPDATE `users` SET `name`='哈哈2' WHERE `id` = 7 // 结构体只会更新非零值字段
// 根据map更新属性,零值和非零值字段都会更新
var user User
db.Debug().First(&user, 7).Updates(map[string]interface{}{
"name": "", "age": 18,
})
// SELECT * FROM `users` WHERE `users`.`id` = 7 ORDER BY `users`.`id` LIMIT 1
// UPDATE `users` SET `age`=18,`name`='' WHERE `users`.`id` = 7 AND `id` = 7 ORDER BY `users`.`id` LIMIT 1

  注意 当通过 struct 更新时,GORM 只会更新非零字段。 如果您想确保指定字段被更新,你应该使用 Select 更新选定字段,或使用 map 来完成更新操作

未完待续....