Gorm FirstOrCreate 的同时更新一些字段
场景:满足某些 where 条件的某条记录,如果已经存在,则将这条记录的某些字段进行更新,如果不存在,则创建这条记录,同时更新指定的字段
FirstOrCreate 语句可以满足不存在则创建记录的要求,但没法继续对指定字段进行更新,如果我们想要完成 不存在即创建,然后更新指定字段 的需求,有以下几种方式:
- 使用多条语句,先使用 where 条件查找记录,若记录不存在,则直接创建,创建的同时指定要更新的字段值;若记录存在,直接更新
- 使用 FirstOrCreate,找到该条要更新的记录,然后更新字段
- 使用事务
下面介绍我目前发现的最佳方式:使用 FirstOrCreate 配合 assign 语句:
var db *gorm.DB// ...init...
userModel := &UserExtraInfo{
AppId: appId,
UserId: userId,
KeyName: keyName,
Value: value,
}
err = db.Where(UserExtraInfo{
AppId: appId,
UserId: userId,
KeyName: keyName,
}).Assign(map[string]interface{}{
"value": value,
}).FirstOrCreate(&userModel).Error
这样,就能在一条语句中完成上面的要求。需要注意的是,这种方式不太好写入 create_time 和 modify_time 字段,所以对于这两个字段,最好在 ddl 中使用 default current_timestamp
,然后在 gorm 语句中忽略这两个字段:
type UserExtraInfo struct { Id int64
AppId int32
UserId int64
KeyName string
Value string
CreateTime time.Time `gorm:"-"`
ModifyTime time.Time `gorm:"-"`
}
以上是 Gorm FirstOrCreate 的同时更新一些字段 的全部内容, 来源链接: utcz.com/z/264440.html