我将 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 来做到这一点的方法。非常感谢任何帮助。
我可以让 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 存储库中添加功能请求。
您可以使用
修改默认返回行为db.Clauses(clause.Returning{}).Create(&cargo)
这里是文档链接:https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows
在 gorm v1.25 中,它不会“返回”标有
gorm:"primaryKey"
的字段。然而,就我而言,我有一些标有 gorm:"default:{}"
的字段,并且所有这些字段都被“返回”。
HTH