Maison  >  Article  >  développement back-end  >  Comment fonctionne la fonctionnalité Upsert de GORM par rapport à FirstOrCreate et FirstOrInit ?

Comment fonctionne la fonctionnalité Upsert de GORM par rapport à FirstOrCreate et FirstOrInit ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-10 00:52:02655parcourir

How Does GORM's Upsert Feature Work Compared to FirstOrCreate and FirstOrInit?

Upsert : création ou mise à jour dans GORM

Dans GORM, les méthodes FirstOrCreate et FirstOrInit peuvent être utilisées pour récupérer ou créer un enregistrement de base de données. Cependant, il peut être difficile de déterminer si un enregistrement a été récemment créé ou mis à jour.

Solution Upsert avec Upsert-On-Conflict

À partir de GORM 1.20.x, une fonctionnalité améliorée La fonctionnalité Upsert est introduite, qui utilise les capacités de gestion des conflits pour diverses bases de données.

// Update columns when conflict on id
DB.Clauses(clause.OnConflict{
  Columns:   []clause.Column{{Name: "id"}},
  DoUpdates: clause.AssignmentColumns([]string{"name", "age"}),
}).Create(&users)

Cet extrait se traduit en instructions SQL telles que :

  • SQL Server : FUSIONNER DANS "utilisateurs" EN UTILISANT *** QUAND NON ASSOCIÉ PUIS INSÉRER *** LORSQUE ASSOCIÉ PUIS UPDATE SET "name"="exclu"."name";
  • PostgreSQL : INSÉRER DANS "users" *** ON CONFLICT ("id") DO UPDATE SET "name"="exclus"."name", "age"="exclus"."age";
  • MySQL  : INSERT INTO 'users' *** ON DUPLICATE KEY UPDATE 'name'=VALUES(name),'age=VALUES(age);

Solution de secours pour les anciens GORM Versions

Pour les versions GORM antérieures à 1.9.x, une approche plus efficace consiste à tenter d'abord une mise à jour, puis à créer un nouvel enregistrement si aucune correspondance n'est trouvée.

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

Distinction entre FirstOrInit et FirstOrCreate

Bien que les deux méthodes aient un objectif similaire, leur comportement est distinct :

  • FirstOrInit : initialise une structure si l'enregistrement ne le fait pas existe, mais ne crée pas l'enregistrement.
  • FirstOrCreate : crée un enregistrement s'il n'existe pas et récupère l'enregistrement dans la structure.

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