有没有办法在使用 go-gorm 创建记录时删除 RETURNING 子句?
Is there a way to remove the RETURNING clause while creating records with go-gorm?
我将 go-gorm 与 postgres 11 数据库一起使用,遇到一个问题,我需要在创建记录时完全删除 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)
我收到错误“错误:无法对关系 Cargo 执行 INSERT RETURNING”。
我尝试使用参数 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"})
将 Create from map 与 Table()
结合使用
在这种情况下,您可以将模型表示为 map[string]interface{}
而不是结构,并像这样使用它:
db.Table("cargos").Create(map[string]interface{}{
"name": "Test",
})
目前 gorm 不能很好地支持这个用例。如果你不能restructure your views to support RETURNING and these options aren't doing it for you, I suggest adding a feature request in the gorm repo.
您可以使用
修改默认返回行为
db.Clauses(clause.Returning{}).Create(&cargo)
这里是文档 link:https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows
我将 go-gorm 与 postgres 11 数据库一起使用,遇到一个问题,我需要在创建记录时完全删除 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)
我收到错误“错误:无法对关系 Cargo 执行 INSERT RETURNING”。
我尝试使用参数 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"})
将 Create from map 与 Table()
结合使用
在这种情况下,您可以将模型表示为 map[string]interface{}
而不是结构,并像这样使用它:
db.Table("cargos").Create(map[string]interface{}{
"name": "Test",
})
目前 gorm 不能很好地支持这个用例。如果你不能restructure your views to support RETURNING and these options aren't doing it for you, I suggest adding a feature request in the gorm repo.
您可以使用
修改默认返回行为db.Clauses(clause.Returning{}).Create(&cargo)
这里是文档 link:https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows