为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
holdtom 2022-08-01 17:28:07
我正在将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)
查看完整描述

2 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

我唯一可以让 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 存储库中添加功能请求。


查看完整回答
反对 回复 2022-08-01
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您可以使用以下命令修改默认返回行为

db.Clauses(clause.Returning{}).Create(&cargo)

此处的文档链接: https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信