为了账号安全,请及时绑定邮箱和手机立即绑定

在 upsert 操作中获取现有和插入的 ID

在 upsert 操作中获取现有和插入的 ID

Go
海绵宝宝撒 2023-02-21 19:10:31
我有一个场景,我需要在表中插入一些数据数组,在这种情况下,如果名称和版本的组合已经存在(复合唯一约束),我需要获取这些 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 的几个函数需要一个指针作为参数,并将用信息更新变量。

显然,所有主要目的是检索信息的函数都是这种情况(FirstFind, ..., cf. https://gorm.io/docs/query.html)。

但对于修改数据的函数也是如此

因此,这种情况下的解决方案是通过Create(&saveDependencyData)而不是Create(saveDependencyData).

与数据库对应的最新信息将在saveDependencyData调用后可用。


查看完整回答
反对 回复 2023-02-21
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信