我有一个场景,我需要在表中插入一些数据数组,在这种情况下,如果名称和版本的组合已经存在(复合唯一约束),我需要获取这些 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。
1 回答
MM们
TA贡献1886条经验 获得超2个赞
如评论中所示:GORM 的几个函数需要一个指针作为参数,并将用信息更新变量。
显然,所有主要目的是检索信息的函数都是这种情况(First
, Find
, ..., cf. https://gorm.io/docs/query.html)。
但对于修改数据的函数也是如此
Create
(https://gorm.io/docs/create.html),Update
( https://gorm.io/docs/update.html#Returning-Data-From-Modified-Rows ) 或者Delete
(https://gorm.io/docs/delete.html#Returning-Data-From-Deleted-Rows)
因此,这种情况下的解决方案是通过Create(&saveDependencyData)
而不是Create(saveDependencyData)
.
与数据库对应的最新信息将在saveDependencyData
调用后可用。
- 1 回答
- 0 关注
- 163 浏览
添加回答
举报
0/150
提交
取消