更新所有字段 Save会更新所有字段,即使你没有赋值
db.First(&user) user.Name = "jinzhu 2" user.Age = 100 db.Save(&user)
更新修改字段 如果你只希望更新指定字段,可以使用Update
或者Updates
db.Model(&user).Update("name" , "hello" ) db.Model(&user).Where("active = ?" , true ).Update("name" , "hello" ) db.Model(&user).Updates(map [string ]interface {}{"name" : "hello" , "age" : 18 , "actived" : false }) db.Model(&user).Updates(User{Name: "hello" , Age: 18 }) db.Model(&user).Updates(User{Name: "" , Age: 0 , Actived: false })
更新选定字段 如果你想更新或忽略某些字段,你可以使用 Select
,Omit
db.Model(&user).Select("name" ).Updates(map [string ]interface {}{"name" : "hello" , "age" : 18 , "actived" : false }) db.Model(&user).Omit("name" ).Updates(map [string ]interface {}{"name" : "hello" , "age" : 18 , "actived" : false })
无 Hooks 更新 上面的更新操作会自动运行 model 的 BeforeUpdate
, AfterUpdate
方法,更新 UpdatedAt
时间戳, 在更新时保存其 Associations
, 如果你不想调用这些方法,你可以使用 UpdateColumn
, UpdateColumns
db.Model(&user).UpdateColumn("name" , "hello" ) db.Model(&user).UpdateColumns(User{Name: "hello" , Age: 18 })
批量更新 批量更新时 Hooks 不会运行
db.Table("users" ).Where("id IN (?)" , []int {10 , 11 }).Updates(map [string ]interface {}{"name" : "hello" , "age" : 18 }) db.Model(User{}).Updates(User{Name: "hello" , Age: 18 }) db.Model(User{}).Updates(User{Name: "hello" , Age: 18 }).RowsAffected
使用 SQL 表达式更新 DB.Model(&product).Update("price" , gorm.Expr("price * ? + ?" , 2 , 100 )) DB.Model(&product).Updates(map [string ]interface {}{"price" : gorm.Expr("price * ? + ?" , 2 , 100 )}) DB.Model(&product).UpdateColumn("quantity" , gorm.Expr("quantity - ?" , 1 )) DB.Model(&product).Where("quantity > 1" ).UpdateColumn("quantity" , gorm.Expr("quantity - ?" , 1 ))
修改 Hooks 中的值 如果你想修改 BeforeUpdate
, BeforeSave
等 Hooks 中更新的值,你可以使用 scope.SetColumn
, 例如:
func (user *User) BeforeSave (scope *gorm.Scope) (err error) { if pw, err := bcrypt.GenerateFromPassword(user.Password, 0 ); err == nil { scope.SetColumn("EncryptedPassword" , pw) } }
其它更新选项 db.Model(&user).Set("gorm:update_option" , "OPTION (OPTIMIZE FOR UNKNOWN)" ).Update("name" , "hello" )