GORM を使用したレコードの作成または更新: FirstOrCreate と Upsert
GORM には、レコードを作成または更新するための 2 つのメソッド (FirstOrCreate と FirstOrInit) が用意されています。ただし、レコードが実際にこれらのメソッドを使用して作成されたかどうかを判断するのは困難な場合があります。
GORM 1.20.x 以降での Upsert サポート
バージョン 1.20.x 以降, GORM では、OnConflict 句を通じて互換性のある Upsert サポートが導入されています。これにより、異なるデータベースでレコードを更新/挿入することができます。
// Update columns on conflict DB.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), }).Create(&users)
GORM 1.9.x 以降の代替アプローチ
GORM の以前のバージョンでは、レコードを作成する効率的な方法または、レコードを更新するには、まず更新を試行し、レコードが更新されない場合は挿入を続けます。
if err := db.Model(&newUser).Where("id = ?", 3333).Update("name", "nick").Error; err != nil { if gorm.IsRecordNotFoundError(err) { db.Create(&newUser) } }
FirstOrInit と FirstOrCreate の違い
FirstOrInit と FirstOrCreate の違いに注意することが重要です。どちらのメソッドも既存のレコードまたは新しく作成されたレコードへのポインターを返しますが、FirstOrInit はレコードを作成せずに構造体を初期化するだけですが、FirstOrCreate はレコードを作成して構造体にクエリします。
以上がFirstOrCreate と Upsert: レコードの作成または更新にはどちらの GORM メソッドを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。