Maison >développement back-end >Golang >Quand dois-je utiliser FirstOrCreate() ou FirstOrInit() dans 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 :
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!