我使用go-gorm和postgres 11 DB,并面临一个问题,在创建记录时,我需要完全删除返回子句(该语句在默认情况下似乎包括在内)。我只想插入记录,除了错误之外,什么也得不到。我在数据库中有一些复杂的关系,它们不支持返回语句,所以当我尝试像这样插入时:(为了简洁起见,使代码更简单)
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连接:
db, _ := gorm.Open(postgres.New(postgres.Config{DSN: dsnString, , WithoutReturning: true}), &gorm.Config{})但是,当我尝试db.Create(cargo)时,我得到了一个不同的错误:“这个驱动程序不支持LastInsertId”。无论如何,它似乎仍在试图获得最后一个插入的id。
在gorm中,我可以使用db.Model(x).Returning("null").Insert(cargo),但是我找不到一种方法来使用gorm。任何帮助都是非常感谢的。
发布于 2021-01-22 14:28:30
让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并不很好地支持这个用例。如果您不能调整您的视图以支持返回,并且这些选项不适合您,我建议在戈姆回购中添加一个特性请求。
发布于 2022-04-01 10:47:22
可以修改默认返回行为
db.Clauses(clause.Returning{}).Create(&cargo)在这里,doc链接:https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows
https://stackoverflow.com/questions/65833623
复制相似问题