Rumah >pembangunan bahagian belakang >Golang >FirstOrCreate vs. Upsert: Kaedah GORM manakah yang patut anda gunakan untuk membuat atau mengemas kini rekod?

FirstOrCreate vs. Upsert: Kaedah GORM manakah yang patut anda gunakan untuk membuat atau mengemas kini rekod?

Linda Hamilton
Linda Hamiltonasal
2024-11-09 16:20:02391semak imbas

FirstOrCreate vs. Upsert: Which GORM method should you use for creating or updating records?

Mencipta atau Mengemas kini Rekod dengan GORM: FirstOrCreate vs. Upsert

GORM menyediakan dua kaedah untuk mencipta atau mengemas kini rekod: FirstOrCreate dan FirstOrInit. Walau bagaimanapun, adalah sukar untuk menentukan sama ada rekod sebenarnya dibuat menggunakan kaedah ini.

Sokongan Upsert dalam GORM 1.20.x dan Ke Atas

Sejak versi 1.20.x , GORM memperkenalkan sokongan Upsert yang serasi melalui klausa OnConflict. Ini membolehkan untuk menambah rekod pada pangkalan data yang berbeza.

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

Pendekatan Alternatif untuk GORM 1.9.x dan Di Bawah

Dalam versi GORM yang terdahulu, kaedah yang cekap untuk mencipta atau kemas kini rekod adalah dengan mencuba kemas kini dahulu, diikuti dengan sisipan jika rekod tidak wujud.

if err := db.Model(&newUser).Where("id = ?", 3333).Update("name", "nick").Error; err != nil {
  if gorm.IsRecordNotFoundError(err) {
    db.Create(&newUser)
  }
}

Perbezaan antara FirstOrInit dan FirstOrCreate

Adalah penting untuk perhatikan perbezaan antara FirstOrInit dan FirstOrCreate. Walaupun kedua-dua kaedah mengembalikan penunjuk kepada rekod sedia ada atau yang baru dibuat, FirstOrInit hanya memulakan struct tanpa mencipta rekod, manakala FirstOrCreate mencipta rekod dan menanyakannya ke dalam struct.

Atas ialah kandungan terperinci FirstOrCreate vs. Upsert: Kaedah GORM manakah yang patut anda gunakan untuk membuat atau mengemas kini rekod?. 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