有没有办法在使用 go-gorm 创建记录时删除 RETURNING 子句?

问题描述 投票:0回答:3

我将 go-gorm 与 postgres 11 DB 一起使用,并面临一个问题,我需要在创建记录时完全删除 RETURNING 子句(该语句似乎默认包含在内)。我只想插入记录,除了错误之外什么也得不到。 我在数据库上有一些复杂的关系,不支持 RETURNING 语句,所以当我尝试像这样插入时:(为了简洁,使代码更简单)

type Cargo struct {
    Id   int64 `gorm:"primaryKey"`
    Name string
}
dsnString := fmt.Sprintf("host=%s ...") 
db, _ := gorm.Open(postgres.New(postgres.Config{DSN: dsnString}), &gorm.Config{})

cargo := Cargo{Name: "test"}
db.Create(cargo)

我收到错误“错误:无法对关系货物执行插入返回”。

我尝试使用参数 WithoutReturning: true:

创建数据库连接
db, _ := gorm.Open(postgres.New(postgres.Config{DSN: dsnString, , WithoutReturning: true}), &gorm.Config{})

但是当我尝试

db.Create(cargo)
时,我收到一个不同的错误:“此驱动程序不支持LastInsertId”。无论如何,它似乎仍在尝试获取最后插入的 id。

在 go-pg 中我可以使用

db.Model(x).Returning("null").Insert(cargo)
但我找不到用 go-gorm 来做到这一点的方法。非常感谢任何帮助。

postgresql go go-gorm
3个回答
1
投票

我可以让 gorm 不使用 postgres 的

RETURNING
子句的唯一两种方法是

未声明主键的模型

这意味着删除名为

ID/Id
或任何标记为
gorm:"primaryKey"
的字段。

type Cargo struct {
    Name string
}
db.Create(&Cargo{Name: "Test"})

使用 从地图创建
Table()

在这种情况下,您可以将模型表示为

map[string]interface{}
而不是结构体,并像这样使用它:

db.Table("cargos").Create(map[string]interface{}{
    "name": "Test",
})

就目前情况而言,gorm 并不能很好地支持这个用例。如果您无法重构您的视图以支持 RETURNING 并且这些选项无法为您执行此操作,我建议在 gorm 存储库中添加功能请求。


0
投票

您可以使用

修改默认返回行为
db.Clauses(clause.Returning{}).Create(&cargo)

这里是文档链接:https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows


0
投票

在 gorm v1.25 中,它不会“返回”标有

gorm:"primaryKey"
的字段。然而,就我而言,我有一些标有
gorm:"default:{}"
的字段,并且所有这些字段都被“返回”。

HTH

© www.soinside.com 2019 - 2024. All rights reserved.