我有一个场景,我需要在表中插入一些数据数组,在这种情况下,如果名称和版本的组合已经存在(复合唯一约束),我需要获取这些 ID,否则获取插入的 ID,如果两种情况exist get inserted 和 existing ids
我试过的模型和代码如下:
模型依赖
type Dependency struct {
gorm.Model
ID string `gorm:"primaryKey; not null"`
Name string `gorm:"not null; UniqueIndex:idx_name_version"`
Version string `gorm:"not null; UniqueIndex:idx_name_version"`
}
使用 gorm 查询代码以插入依赖项
var saveDependencyData []models.Dependency
// Dependecies are read form api input
// [
// {
// "name": "node",
// "version": "16.0.0"
// },
// {
// "name": "node",
// "version": "18.0.0"
// }
// ]
for _, dep := range Dependecies {
saveDependencyData = append(saveDependencyData, models.Dependency{
ID: nanoid.New(),
Name: dep.Name,
Version: dep.Version,
})
}
res := db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "name"}, {Name: "version"}},
DoUpdates: clause.AssignmentColumns([]string{"name"}),
}).Create(saveDependencyData)
gorm查询输出
INSERT INTO "dependencies" ("id","created_at","updated_at","deleted_at","name","version") VALUES ('QanL-nfNFrOGdxG2iXdoQ','2022-10-06 19:21:13.079','2022-10-06 19:21:13.079',NULL,'react','16.0.0'),('Yw1YyQ-aBqrQtwZ72GNtB','2022-10-06 19:21:13.079','2022-10-06 19:21:13.079',NULL,'react','18.0.0') ON CONFLICT ("name","version") DO UPDATE SET "name"="excluded"."name" RETURNING "id"
此查询返回我需要的 ID 列表,但找不到检索它的方法。
使用 Scan() 获取该表中的所有数据。
您可以提供一种从上述 GORM db.Clauses() 中检索返回 ID 的方法,或者使用任何其他优化方法来使用更新插入查询获取那些(插入的和现有的)ID。
MM们
相关分类