Wie funktioniert die Upsert-Funktion von GORM im Vergleich zu FirstOrCreate und FirstOrInit?

Mary-Kate Olsen
Freigeben: 2024-11-10 00:52:02
Original
642 Leute haben es durchsucht

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

Upsert: Erstellen oder Aktualisieren in GORM

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)
Nach dem Login kopieren

Dieses Snippet übersetzt sich in SQL-Anweisungen wie:

  • SQL Server: MERGE INTO „users“ USING *** WHEN NOT MATCHED THEN INSERT *** WHEN MATCHED THEN UPDATE SET „name“ ="excluded"."name";
  • PostgreSQL: INSERT INTO "users" *** ON CONFLICT ("id") DO UPDATE SET "name"="excluded"."name", "age"="excluded"."age";
  • MySQL : INSERT INTO 'users' *** ON DUPLICATE KEY UPDATE 'name'=VALUES(name),'age=VALUES(age);

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
  }
}
Nach dem Login kopieren

Unterscheidung zwischen FirstOrInit und FirstOrCreate

Während beide Methoden einem ähnlichen Zweck dienen, ist ihr Verhalten unterschiedlich:

  • FirstOrInit: Initialisiert eine Struktur, wenn der Datensatz nicht vorhanden ist, erstellt ihn jedoch nicht Datensatz.
  • FirstOrCreate: Erstellt einen Datensatz, wenn er nicht vorhanden ist, und ruft den Datensatz in der Struktur ab.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage