Home > Backend Development > Golang > When Should I Use FirstOrCreate() vs. FirstOrInit() in GORM?

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

Mary-Kate Olsen
Release: 2024-11-12 03:45:01
Original
932 people have browsed it

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

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
}
Copy after login

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)
Copy after login

This query translates into SQL statements like:

  • MERGE INTO... WHEN NOT MATCHED THEN INSERT... WHEN MATCHED THEN UPDATE... (SQL Server)
  • INSERT INTO... ON CONFLICT (...) DO UPDATE SET... (PostgreSQL)
  • INSERT INTO... ON DUPLICATE KEY UPDATE... (MySQL)

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template