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

我有一个场景,我需要在表中插入一些数据数组,在这种情况下,如果名称和版本的组合已经存在(复合唯一约束),我需要获取这些 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。


海绵宝宝撒
浏览 166回答 1
1回答

MM们

如评论中所示: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调用后可用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go