Skip to content
On this page

Update

保存所有字段

  • Save会保存所有字段,包括零值

  • Save是一个组合函数,如果保存的数据不包含主键,它将执行Create,否则将执行Update(包含所有字段)

Go
var first Teacher
DB.First(&first)
first.Name = "First Save"
first.Age = 88
DB.Save(&first)
// UPDATE `teachers` SET `name`='First Save',`age`=88,`gender`=1 WHERE `id` = 1

var s Teacher
s.Age = 98
DB.Save(&s)
// INSERT INTO `teachers` (`name`,`age`,`gender`) VALUES ('',98,0)

DB.Save(&Teacher{ID: 11, Name: "魔灵", Age: 20, Gender: 1})
// UPDATE `teachers` SET `name`='魔灵',`age`=20,`gender`=1 WHERE `id` = 11

更新单列

  • 使用Update更新单列时,需要指定条件,否则的话会返回ErrMissingWhereClause错误

  • 当使用了Model方法,且该对象主键有值,该值会被用于构建条件

Go
DB.Model(&Teacher{}).Where("age = ? AND gender = ?", "98", "0").Update("name", "动灵")
// UPDATE `teachers` SET `name`='动灵' WHERE age = '98' AND gender = '0'

var u Teacher
DB.Take(&u)
DB.Model(&u).Update("name", "剑灵")
// SELECT * FROM `teachers` LIMIT 1
// UPDATE `teachers` SET `name`='剑灵' WHERE `id` = 1

更新多列

  • Updates方法支持structmap[string]interface{}参数

  • 当使用struct更新时,默认情况下,GORM只会更新非零值的字段

Go
s := Teacher{ID: 2}
DB.Model(&s).Updates(Teacher{Age: 19})
// UPDATE `teachers` SET `age`=19 WHERE `id` = 2

s := Teacher{ID: 2}
DB.Model(&s).Updates(Teacher{Age: 19, Name: "吴文登"})
// UPDATE `teachers` SET `name`='吴文登',`age`=19 WHERE `id` = 2

更新指定字段

Go
// 使用Select指定更新的字段
s := Teacher{ID: 2}
DB.Model(&s).Select("age", "gender").Updates(Teacher{Age: 19, Name: "吴文登", Gender: 1})
// UPDATE `teachers` SET `age`=19,`gender`=1 WHERE `id` = 2