Gorm にはFirstOrCreate
メソッドFirstOrInit
がありますが、レコードが実際に作成されたかどうかを後で確認する方法はありますか? レコードが存在しない場合は作成し、存在する場合はいくつかのフィールドを更新したいと考えています。
8 に答える
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
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"
FirstOrInit
新しいレコードを作成しません。最初に一致したレコードのみを検索し、見つからない場合は指定された条件で初期化します。
との両方FirstOrCreate
にFirstOrInit
、 を使用できますRowsAffected
。戻り値が「1」の場合、レコードは DB で見つかった、つまり、すでに存在するため、作成されませんでした。戻り値が「0」の場合は見つかりませんでした。
... 存在する場合は、いくつかのフィールドを更新したいと思います。
この更新がどこにあるのかわかりません。map
/struct
またはDB内でローカルに。地元なら、今すぐできると思います。DB の場合は、Attrs
またはAssign
メソッドを使用することをお勧めします。
こちらの属性を参照してください。レコードが実際に作成されたかどうかは正確にはわかりませんが、レコードが実際に作成された場合にのみ一部のフィールドを更新できます (これは最終的に達成したいことのようです)。
それを行うより良い方法があります:
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 つのフィルター フィールドを提供する必要があります。