GORM を使用してレコードを作成または更新する
GORM には、データベース内のレコードを管理するための 2 つのメソッド、FirstOrCreate() と FirstOrInit() が用意されています。ただし、レコードの作成と更新を区別する必要があるシナリオに遭遇することがあります。
レコード作成の確認
FirstOrCreate() は、レコードに基づいてレコードを検索しようとします。指定された基準に基づいて。存在する場合は、既存のレコードを返します。存在しない場合は、新しいレコードを作成し、新しく作成されたレコードを返します。
レコードが実際に作成されたかどうかを確認するには、トランザクションで Create メソッドを使用できます。トランザクションが成功すると、レコードが作成されます。トランザクションが失敗した場合は、レコードがすでに存在し、作成されなかったことを意味します。
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 }
GORM による Upsert
GORM 1.20.x 以降、便利な機能「アップサート」と呼ばれる機能が利用可能です。互換性のある「Upsert-On-Conflict」メカニズムを提供することで、CreateOrUpdateRecord の機能を組み合わせています。
// 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)
このクエリは、次のような SQL ステートメントに変換されます。
FirstOrInit と FirstOrCreate
FirstOrInit() に注意することが重要です。と FirstOrCreate() は異なる目的を果たします。 FirstOrInit() は構造体を初期化しますが、データベースにレコードは作成しません。一方、FirstOrCreate() はレコードを作成し、それを指定された構造体にクエリします。
以上がGORM では FirstOrCreate() と FirstOrInit() をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。