ホームページ  >  記事  >  バックエンド開発  >  GORM では FirstOrCreate() と FirstOrInit() をいつ使用する必要がありますか?

GORM では FirstOrCreate() と FirstOrInit() をいつ使用する必要がありますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-12 03:45:01899ブラウズ

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

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 ステートメントに変換されます。

  • MERGE INTO...一致しない場合は挿入... 一致した場合は更新... (SQL Server)
  • 競合する場合は挿入... (...) 設定を更新します... (PostgreSQL)
  • INSERT INTO... ON DUPLICATE KEY UPDATE... (MySQL)

FirstOrInit と FirstOrCreate

FirstOrInit() に注意することが重要です。と FirstOrCreate() は異なる目的を果たします。 FirstOrInit() は構造体を初期化しますが、データベースにレコードは作成しません。一方、FirstOrCreate() はレコードを作成し、それを指定された構造体にクエリします。

以上がGORM では FirstOrCreate() と FirstOrInit() をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。