首頁 >後端開發 >Golang >我什麼時候應該在 GORM 中使用 FirstOrCreate() 與 FirstOrInit() ?

我什麼時候應該在 GORM 中使用 FirstOrCreate() 與 FirstOrInit() ?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-12 03:45:01933瀏覽

When Should I Use FirstOrCreate() vs. FirstOrInit() in GORM?

使用 GORM 建立或更新記錄

GORM 提供了兩種管理資料庫中記錄的方法:FirstOrCreate() 和 FirstOrInit()。但是,有時您可能會遇到需要區分建立和更新記錄的情況。

檢查記錄建立

FirstOrCreate() 嘗試根據記錄查找記錄根據指定的標準。如果存在,則傳回現有記錄。如果不存在,則建立新記錄並傳回新建立的記錄。

要檢查記錄是否實際創建,您可以在交易中使用 Create 方法。如果交易成功,則記錄已建立。如果交易失敗,則表示該記錄已存在且尚未建立。

func CreateOrUpdateRecord(tx *gorm.DB, record *Model) error {
    if err := tx.Create(record).Error; err != nil {
        return err // Record already exists
    }

    return nil // Record created
}

使用 GORM 更新插入

從 GORM 1.20.x 開始,這是一個方便的功能稱為「Upsert」可用。它透過提供相容的「衝突時更新插入」機制結合了 CreateOrUpdateRecord 的功能。

// Update columns to new value on `id` conflict
tx.Clauses(clause.OnConflict{
    Columns:   []clause.Column{{Name: "id"}}, // key column
    DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), // columns needed to be updated
}).Create(&users)

此查詢轉換為SQL 語句,例如:

  • MERGE INTO...當不匹配時插入...當匹配時更新...(SQL伺服器)
  • 插入...衝突(...)執行更新設定...(PostgreSQL)
  • 插入...重複鍵更新...(MySQL)

FirstOrInit 與FirstOrInit 對比FirstOrCreate

需要注意的是,FirstOrInit() 和FirstOrCreate() 有不同的用途。 FirstOrInit() 初始化一個結構體,但不會在資料庫中建立記錄。另一方面,FirstOrCreate() 將建立一筆記錄,然後將其查詢到提供的結構中。

以上是我什麼時候應該在 GORM 中使用 FirstOrCreate() 與 FirstOrInit() ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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