Heim  >  Artikel  >  Backend-Entwicklung  >  Wann sollte ich FirstOrCreate() vs. FirstOrInit() in GORM verwenden?

Wann sollte ich FirstOrCreate() vs. FirstOrInit() in GORM verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-12 03:45:01858Durchsuche

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

Erstellen oder aktualisieren Sie einen Datensatz mit GORM

GORM bietet zwei Methoden zum Verwalten von Datensätzen in Ihrer Datenbank: FirstOrCreate() und FirstOrInit(). Manchmal kann es jedoch vorkommen, dass Sie zwischen dem Erstellen und Aktualisieren eines Datensatzes unterscheiden müssen.

Auf Datensatzerstellung prüfen

FirstOrCreate() versucht, einen Datensatz basierend auf zu finden nach den vorgegebenen Kriterien. Wenn er vorhanden ist, wird der vorhandene Datensatz zurückgegeben. Wenn er nicht vorhanden ist, wird ein neuer Datensatz erstellt und der neu erstellte zurückgegeben.

Um zu überprüfen, ob ein Datensatz tatsächlich erstellt wurde, können Sie die Create-Methode in einer Transaktion verwenden. Wenn die Transaktion erfolgreich ist, wurde der Datensatz erstellt. Wenn die Transaktion fehlschlägt, bedeutet das, dass der Datensatz bereits existierte und nicht erstellt wurde.

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

Ab GORM 1.20.x eine praktische Funktion namens „Upsert“ ist verfügbar. Es kombiniert die Funktionalität von CreateOrUpdateRecord, indem es einen kompatiblen „Upsert-On-Conflict“-Mechanismus bereitstellt.

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

Diese Abfrage wird in SQL-Anweisungen übersetzt wie:

  • MERGE INTO... WENN NICHT ÜBEREINSTIMMUNG, DANN EINFÜGEN... BEI ÜBEREINSTIMMUNG, DANN AKTUALISIEREN... (SQL Server)
  • INSERT INTO... ON CONFLICT (...) DO UPDATE SET... (PostgreSQL)
  • INSERT INTO... ON DUPLICATE KEY UPDATE... (MySQL)

FirstOrInit vs . FirstOrCreate

Es ist wichtig zu beachten, dass FirstOrInit() und FirstOrCreate() unterschiedliche Zwecke erfüllen. FirstOrInit() initialisiert eine Struktur, erstellt jedoch keinen Datensatz in der Datenbank. FirstOrCreate() hingegen erstellt einen Datensatz und fragt ihn dann in der bereitgestellten Struktur ab.

Das obige ist der detaillierte Inhalt vonWann sollte ich FirstOrCreate() vs. FirstOrInit() in GORM verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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