gpt4 book ai didi

go - 如何使用 GORM 创建或更新记录?

转载 作者:IT王子 更新时间:2023-10-29 01:09:37 25 4
gpt4 key购买 nike

Gorm 有一个FirstOrCreate 方法和一个FirstOrInit 但是如何检查记录是否真的被创建了呢?如果记录不存在,我想创建一条记录,如果存在,我想更新一些字段。

最佳答案

更新2020.10.09

感谢@vaelin

从 1.20.x 开始,GORM 为不同的数据库提供兼容的 Upsert 支持( Upsert-On-Conflict )

// Update columns to new value on `id` conflict
DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}}, // key colume
DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), // column needed to be updated
}).Create(&users)
// MERGE INTO "users" USING *** WHEN NOT MATCHED THEN INSERT *** WHEN MATCHED THEN UPDATE SET "name"="excluded"."name"; SQL Server
// INSERT INTO "users" *** ON CONFLICT ("id") DO UPDATE SET "name"="excluded"."name", "age"="excluded"."age"; PostgreSQL
// INSERT INTO `users` *** ON DUPLICATE KEY UPDATE `name`=VALUES(name),`age=VALUES(age); MySQL

gorm 1.9.x及以下版本,先更新,不存在再插入会更高效。

// update only set name=nick
if err := db.Model(&newUser).Where("id = ?", 3333).Update("name", "nick").Error; err != nil {
// always handle error like this, cause errors maybe happened when connection failed or something.
// record not found...
if gorm.IsRecordNotFoundError(err){
db.Create(&newUser) // create new record from newUser
}
}

FirstOrInitFirstOrCreate 是不同的。如果数据库中没有匹配记录,FirstOrInit 将初始化结构但不创建记录,FirstOrCreate 将创建一条记录并查询该记录以构造。

关于go - 如何使用 GORM 创建或更新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39333102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com