16

Gorm にはFirstOrCreateメソッドFirstOrInitがありますが、レコードが実際に作成されたかどうかを後で確認する方法はありますか? レコードが存在しない場合は作成し、存在する場合はいくつかのフィールドを更新したいと考えています。

4

8 に答える 8

1

gorm ドキュメントのCRUD セクションの例を次に示します。

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}

db.NewRecord(user) // => returns `true` as primary key is blank

db.Create(&user)

db.NewRecord(user) // => return `false` after `user` created
于 2016-09-05T15:35:59.923 に答える
1
gormDB.Where(entity.AggregatedData{Type: v.Type}).Assign(entity.AggregatedData{Type: v.Type, Data: v.Data}).FirstOrCreate(v)


 SELECT * FROM "aggregated_data"  WHERE ("aggregated_data"."type" = '2') ORDER BY "aggregated_data"."id" ASC LIMIT 1 

存在する場合

 UPDATE "aggregated_data" SET "data" = '[{"a":2}]', "type" = '2'  WHERE "aggregated_data"."id" = '2' AND (("aggregated_data"."type" = '2'))  

そうしないと

INSERT INTO "aggregated_data" ("data","type") VALUES ('[{"a":2}]','1') RETURNING "aggregated_data"."id"  
于 2019-01-18T08:09:27.920 に答える
1

FirstOrInit新しいレコードを作成しません。最初に一致したレコードのみを検索し、見つからない場合は指定された条件で初期化します。

との両方FirstOrCreateFirstOrInit、 を使用できますRowsAffected。戻り値が「1」の場合、レコードは DB で見つかった、つまり、すでに存在するため、作成されませんでした。戻り値が「0」の場合は見つかりませんでした。

... 存在する場合は、いくつかのフィールドを更新したいと思います。

この更新がどこにあるのかわかりません。map/structまたはDB内でローカルに。地元なら、今すぐできると思います。DB の場合は、AttrsまたはAssignメソッドを使用することをお勧めします。

于 2021-06-30T22:28:17.463 に答える
0

こちらの属性を参照してください。レコードが実際に作成されたかどうかは正確にはわかりませんが、レコードが実際に作成された場合にのみ一部のフィールドを更新できます (これは最終的に達成したいことのようです)。

于 2016-09-07T02:47:35.343 に答える
0

それを行うより良い方法があります:

    if err := db.Where(User{Email: "some@email.com"}).
       Assign(User{Email: "some@email.com", Age: 45}).
       FirstOrCreate(&User{}).Error; err != nil {
         c.Next(err)
         return
    }

この例では、「some@email.com」という電子メールを持つユーザーが見つかった場合、フィールド「Age」が更新されます。逆に、ユーザーが見つからない場合は作成されます。

作成したユーザーは破棄していますが、必要に応じて参照を保持できます。また、いくつかの GORM の理由により、Assign 句に少なくとも 1 つのフィルター フィールドを提供する必要があります

于 2020-09-21T03:23:30.660 に答える