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:"-"`
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论