Create or Update a Record with GORM
GORM offers two methods for managing records in your database: FirstOrCreate() and FirstOrInit(). However, sometimes you may encounter scenarios where you need to differentiate between creating and updating a record.
Checking for Record Creation
FirstOrCreate() attempts to find a record based on the specified criteria. If it exists, it returns the existing record. If it doesn't exist, it creates a new record and returns the newly created one.
To check if a record was actually created, you can use the Create method in a transaction. If the transaction succeeds, the record was created. If the transaction fails, it means the record already existed and was not created.
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 }
Upsert with GORM
As of GORM 1.20.x, a convenient feature called "Upsert" is available. It combines the functionality of CreateOrUpdateRecord by providing a compatible "Upsert-On-Conflict" mechanism.
// 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)
This query translates into SQL statements like:
FirstOrInit vs. FirstOrCreate
It's important to note that FirstOrInit() and FirstOrCreate() serve different purposes. FirstOrInit() initializes a struct but does not create a record in the database. FirstOrCreate(), on the other hand, will create a record and then query it into the provided struct.
The above is the detailed content of When Should I Use FirstOrCreate() vs. FirstOrInit() in GORM?. For more information, please follow other related articles on the PHP Chinese website!