Maison >développement back-end >Golang >Quand dois-je utiliser FirstOrCreate() ou FirstOrInit() dans GORM ?

Quand dois-je utiliser FirstOrCreate() ou FirstOrInit() dans GORM ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-12 03:45:01933parcourir

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

Créer ou mettre à jour un enregistrement avec GORM

GORM propose deux méthodes pour gérer les enregistrements dans votre base de données : FirstOrCreate() et FirstOrInit(). Cependant, vous pouvez parfois rencontrer des scénarios dans lesquels vous devez faire la différence entre la création et la mise à jour d'un enregistrement.

Vérification de la création d'un enregistrement

FirstOrCreate() tente de trouver un enregistrement basé sur sur les critères spécifiés. S'il existe, il renvoie l'enregistrement existant. S'il n'existe pas, il crée un nouvel enregistrement et renvoie celui nouvellement créé.

Pour vérifier si un enregistrement a réellement été créé, vous pouvez utiliser la méthode Create dans une transaction. Si la transaction réussit, l'enregistrement a été créé. Si la transaction échoue, cela signifie que l'enregistrement existait déjà et n'a pas été créé.

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 avec GORM

À partir de GORM 1.20.x, une fonctionnalité pratique appelé "Upsert" est disponible. Il combine les fonctionnalités de CreateOrUpdateRecord en fournissant un mécanisme compatible "Upsert-On-Conflict".

// 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)

Cette requête se traduit en instructions SQL telles que :

  • MERGE INTO... QUAND PAS DE CORRESPONDANCE PUIS INSÉRER... LORSQUE CORRESPONDANCE PUIS METTRE À JOUR... (SQL Server)
  • INSÉRER DANS... EN CONFLIT (...) FAIRE MISE À JOUR ENSEMBLE... (PostgreSQL)
  • INSÉRER DANS... LORS DE LA MISE À JOUR DE LA CLÉ EN DUPLICATE... (MySQL)

FirstOrInit vs. FirstOrCreate

Il est important de noter que FirstOrInit() et FirstOrCreate() servent à des fins différentes. FirstOrInit() initialise une structure mais ne crée pas d'enregistrement dans la base de données. FirstOrCreate(), d'autre part, créera un enregistrement puis l'interrogera dans la structure fournie.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn