在 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 語句,例如:
舊版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
雖然這兩種方法有相似的目的,但它們的行為是不同的:
以上是與 FirstOrCreate 和 FirstOrInit 相比,GORM 的 Upsert 功能如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!