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

Is there a way to remove the RETURNING clause while creating records with go-gorm?

我将 go-gorm 与 postgres 11 数据库一起使用,遇到一个问题,我需要在创建记录时完全删除 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)

我收到错误“错误:无法对关系 Cargo 执行 INSERT RETURNING”。

我尝试使用参数 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 的方法。非常感谢任何帮助。

我可以让 gorm 不使用 postgres 的 RETURNING 子句的唯一两种方法是

没有声明主键的模型

这意味着删除名为 ID/Id 或任何标记为 gorm:"primaryKey" 的字段。

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

Create from mapTable()

结合使用

在这种情况下,您可以将模型表示为 map[string]interface{} 而不是结构,并像这样使用它:

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

目前 gorm 不能很好地支持这个用例。如果你不能restructure your views to support RETURNING and these options aren't doing it for you, I suggest adding a feature request in the gorm repo.

您可以使用

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

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