Gorm FirstOrCreate 的同时更新一些字段

发布于 2022-01-19 13:11:42 字数 1139 浏览 1489 评论 0

场景:满足某些 where 条件的某条记录,如果已经存在,则将这条记录的某些字段进行更新,如果不存在,则创建这条记录,同时更新指定的字段

FirstOrCreate 语句可以满足不存在则创建记录的要求,但没法继续对指定字段进行更新,如果我们想要完成 不存在即创建,然后更新指定字段 的需求,有以下几种方式:

  1. 使用多条语句,先使用 where 条件查找记录,若记录不存在,则直接创建,创建的同时指定要更新的字段值;若记录存在,直接更新
  2. 使用 FirstOrCreate,找到该条要更新的记录,然后更新字段
  3. 使用事务

下面介绍我目前发现的最佳方式:使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文