我有一個場景,我需要向表中插入一些資料陣列,在這種情況下,如果名稱和版本的組合已經存在(復合唯一約束),我需要獲取這些 ID,否則獲取插入的 ID,如果這兩種情況存在獲取插入和現有的ID
我嘗試過的模型和代碼如下:
模型依賴
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,或者任何其他優化的方法來通過 upsert 查詢獲取這些(插入的和現有的)ID。
uj5u.com熱心網友回復:
正如評論中所指出的: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然后,與資料庫對應的最新資訊將在呼叫后可用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/511370.html
下一篇:在一段時間內平均變數
