【问题标题】:GORM: upsert not inserting proper valuesGORM:upsert没有插入正确的值
【发布时间】:2020-12-02 12:29:52
【问题描述】:

我正在尝试找到一种方法来 UPSERT 某些值,但我遇到了一些意外行为。例如:

db.Clauses(clause.OnConflict{
    Columns:   []clause.Column{{Name: "name"}},
    DoUpdates: clause.AssignmentColumns([]string{"name", "email"}),
})

返回

ON CONFLICT (name) DO UPDATE SET name = {excluded name %!s(bool=false)}, email = {excluded email %!s(bool=false)} RETURNING *

,这似乎不对。

我还尝试构建名称和表达式的地图:

values := map[email:excluded.email name:excluded.name col3:table.col3+excluded.col3]

db.Clauses(clause.OnConflict{
    Columns:   []clause.Column{{Name: "name"}},
    DoUpdates: clause.Assignments(values),
})

生成

DO UPDATE SET "email"='excluded.email',"name"='excluded.name'

但我期待

DO UPDATE SET "email"="excluded.email","name"="excluded.name"

Gorm 版本:v1.20.6

Golang 版本:1.12

Postgres 12

【问题讨论】:

  • Gorm 的较新版本与 1.13 以下的 Go 版本存在一些问题。 Go 现在是 1.15,尝试升级到那个。也许它对您的具体问题没有帮助,但最好使用 12 以上的 Go 版本。

标签: postgresql go go-gorm


【解决方案1】:

刚刚遇到了一个类似的问题,当更新引用此关联的模型时,GORM 没有更新关联表的数据(例如:在具有关联 bill 模型的 user 表上更新插入,其中 bill数据已更改,预计将与user 的保存一起保存)。

事实证明,GORM 只更新产生关联/外键的字段,而不是实际数据。您需要打开FullSaveAssociations 会话选项才能更新所有字段。 (见https://gorm.io/docs/session.html#FullSaveAssociationshttps://github.com/go-gorm/gorm/issues/3506

【讨论】:

  • 非常感谢!帮我省了很多麻烦
猜你喜欢
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2021-07-01
相关资源
最近更新 更多