Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Ciri Upsert GORM Berfungsi Berbanding dengan FirstOrCreate dan FirstOrInit?

Bagaimanakah Ciri Upsert GORM Berfungsi Berbanding dengan FirstOrCreate dan FirstOrInit?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-10 00:52:02656semak imbas

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

Upsert: Mencipta atau Mengemas kini dalam GORM

Dalam GORM, kedua-dua kaedah FirstOrCreate dan FirstOrInit boleh digunakan untuk mendapatkan semula atau mencipta rekod pangkalan data. Walau bagaimanapun, menentukan sama ada rekod baru dibuat atau dikemas kini mungkin tidak jelas.

Penyelesaian Upsert dengan Upsert-On-Conflict

Dari GORM 1.20.x dan seterusnya, penyelesaian yang dipertingkatkan Ciri Upsert diperkenalkan, yang menggunakan keupayaan pengendalian konflik untuk pelbagai pangkalan data.

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

Coretan ini diterjemahkan kepada pernyataan SQL seperti:

  • SQL Server: BERGABUNG KE DALAM "pengguna" MENGGUNAKAN *** APABILA TIDAK DIPADAKAN KEMUDIAN MASUKKAN *** APABILA DIPADIKAN MAKA KEMASKINI SET "name"="excluded"."name";
  • PostgreSQL: INSERT IN TO "users" *** ON CONFLICT ("id") DO UPDATE SET "name"="excluded "."name", "age"="excluded"."age";
  • MySQL: MASUKKAN KE DALAM 'pengguna' *** PADA DUPLICATE KEY UPDATE 'name'=VALUES(name),'age=VALUES(age);

Fallback Solution untuk Versi GORM Lama

Untuk versi GORM sebelum 1.9.x, pendekatan yang lebih cekap ialah mencuba kemas kini dahulu, diikuti dengan mencipta yang baharu rekod jika tiada padanan ditemui.

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

Membezakan antara FirstOrInit dan FirstOrCreate

Walaupun kedua-dua kaedah mempunyai tujuan yang sama, tingkah lakunya adalah berbeza:

  • FirstOrInit: Memulakan struct jika rekod tidak wujud, tetapi tidak mencipta rekod.
  • FirstOrCreate: Mencipta rekod jika ia tidak wujud dan mendapatkan semula rekod ke struct.

Atas ialah kandungan terperinci Bagaimanakah Ciri Upsert GORM Berfungsi Berbanding dengan FirstOrCreate dan FirstOrInit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn