In GORM können sowohl die FirstOrCreate- als auch die FirstOrInit-Methode zum Abrufen oder Erstellen eines Datenbankeintrags verwendet werden. Allerdings kann unklar sein, ob ein Datensatz neu erstellt oder aktualisiert wurde.
Upsert-Lösung mit Upsert-On-Conflict
Ab GORM 1.20.x eine verbesserte Die Upsert-Funktion wird eingeführt, die Konfliktbehandlungsfunktionen für verschiedene Datenbanken nutzt.
// Update columns when conflict on id DB.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), }).Create(&users)
Dieses Snippet übersetzt sich in SQL-Anweisungen wie:
Fallback-Lösung für ältere GORM-Versionen
Für GORM-Versionen vor 1.9 .x besteht ein effizienterer Ansatz darin, zuerst eine Aktualisierung zu versuchen und anschließend einen neuen Datensatz zu erstellen, wenn keine Übereinstimmung vorliegt gefunden.
// 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 } }
Unterscheidung zwischen FirstOrInit und FirstOrCreate
Während beide Methoden einem ähnlichen Zweck dienen, ist ihr Verhalten unterschiedlich:
Das obige ist der detaillierte Inhalt vonWie funktioniert die Upsert-Funktion von GORM im Vergleich zu FirstOrCreate und FirstOrInit?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!