猿问

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

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


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 创建 db 连接:true:


db, _ := gorm.Open(postgres.New(postgres.Config{DSN: dsnString, , WithoutReturning: true}), &gorm.Config{})

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


在go-pg中,我可以使用,但我找不到一种方法来使用go-gorm来做到这一点。任何帮助都非常感谢。db.Model(x).Returning("null").Insert(cargo)


holdtom
浏览 187回答 2
2回答

慕尼黑8549860

我唯一可以让 gorm 不将子句与 postgres 一起使用的两种方式是RETURNING不声明主键的模型这意味着要删除已命名的字段或任何标记的字段。ID/Idgorm:"primaryKey"type Cargo struct {    Name string}db.Create(&Cargo{Name: "Test"})使用“从地图创建”,使用Table()在这种情况下,您可以将模型表示为 a 而不是结构,并按如下方式使用它:map[string]interface{}db.Table("cargos").Create(map[string]interface{}{    "name": "Test",})就目前而言,gorm并不能很好地支持这个用例。如果您无法重组视图以支持 RETURN,并且这些选项无法为您完成此操作,我建议在 gorm 存储库中添加功能请求。

胡说叔叔

您可以使用以下命令修改默认返回行为db.Clauses(clause.Returning{}).Create(&cargo)此处的文档链接: https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows
随时随地看视频慕课网APP

相关分类

Go
我要回答