我正在将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 存储库中添加功能请求。
胡说叔叔
TA贡献1804条经验 获得超8个赞
您可以使用以下命令修改默认返回行为
db.Clauses(clause.Returning{}).Create(&cargo)
此处的文档链接: https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows
- 2 回答
- 0 关注
- 186 浏览
添加回答
举报
0/150
提交
取消