首頁 >後端開發 >Golang >與 FirstOrCreate 和 FirstOrInit 相比,GORM 的 Upsert 功能如何運作?

與 FirstOrCreate 和 FirstOrInit 相比,GORM 的 Upsert 功能如何運作?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-10 00:52:02661瀏覽

How Does GORM's Upsert Feature Work Compared to FirstOrCreate and FirstOrInit?

Upsert:在 GORM 中建立或更新

在 GORM 中,FirstOrCreate 和 FirstOrInit 方法都可以用來檢索或建立資料庫記錄。但是,確定記錄是新建立還是更新可能不清楚。

使用Upsert-On-Conflict 的Upsert 解決方案

從GORM 1.20.x 開始,增強的引入了Upsert 功能,該功能利用各種資料庫的衝突處理功能。

// Update columns when conflict on id
DB.Clauses(clause.OnConflict{
  Columns:   []clause.Column{{Name: "id"}},
  DoUpdates: clause.AssignmentColumns([]string{"name", "age"}),
}).Create(&users)

此程式碼段轉換為SQL 語句,例如:

  • SQL Server:合併到「使用者」中使用*** 不符合時則插入*** 匹配時則更新SET "name"="excluded"."name";
  • PostgreSQL: INSERT INTO “用戶”***發生衝突(“id”)時執行更新設定“名稱”=“排除」。 “名稱”,“年齡”=“排除”。 「年齡」;
  • MySQL : INSERT INTO 'users' *** ON DUPLICATE KEY UPDATE 'name'=VALUES(name),'age=VALUES(age);

舊版GORM的後備解決方案版本

對於 1.9.x 之前的 GORM 版本,更有效的方法是先嘗試更新,如果沒有找到匹配則創建新記錄。

// Update only set name=nick
if err := db.Model(&newUser).Where("id = ?", 3333).Update("name", "nick").Error; err != nil {
  // Handle error...
  if gorm.IsRecordNotFoundError(err) {
    db.Create(&newUser)  // Create new record from newUser
  }
}

區分FirstOrInit 和FirstOrCreate

雖然這兩種方法有相似的目的,但它們的行為是不同的:

  • FirstOrInit:如果記錄不存在,則初始化結構體存在,但不建立記錄。
  • FirstOrCreate:如果不存在則建立記錄,並將記錄檢索到結構體。

以上是與 FirstOrCreate 和 FirstOrInit 相比,GORM 的 Upsert 功能如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn