首页 >后端开发 >Golang >与 FirstOrCreate 和 FirstOrInit 相比,GORM 的 Upsert 功能如何工作?

与 FirstOrCreate 和 FirstOrInit 相比,GORM 的 Upsert 功能如何工作?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-10 00:52:02661浏览

How Does GORM's Upsert Feature Work Compared to FirstOrCreate and FirstOrInit?

Upsert:在 GORM 中创建或更新

在 GORM 中,FirstOrCreate 和 FirstOrInit 方法都可以用来检索或创建数据库记录。但是,确定记录是新创建还是更新可能不清楚。

使用 Upsert-On-Conflict 的 Upsert 解决方案

从 GORM 1.20.x 开始,增强的引入了 Upsert 功能,该功能利用各种数据库的冲突处理功能。

// Update columns when conflict on id
DB.Clauses(clause.OnConflict{
  Columns:   []clause.Column{{Name: "id"}},
  DoUpdates: clause.AssignmentColumns([]string{"name", "age"}),
}).Create(&users)

此代码段转换为 SQL 语句,例如:

  • SQL Server:合并到“用户”中使用 *** 不匹配时则插入 *** 匹配时则更新 SET "name"="excluded"."name";
  • PostgreSQL: INSERT INTO “用户”***发生冲突(“id”)时执行更新设置“名称”=“排除”。“名称”,“年龄”=“排除”。“年龄”​​;
  • MySQL : INSERT INTO 'users' *** ON DUPLICATE KEY UPDATE 'name'=VALUES(name),'age=VALUES(age);

旧版 GORM 的后备解决方案版本

对于 1.9.x 之前的 GORM 版本,更有效的方法是先尝试更新,如果没有找到匹配则创建新记录。

// Update only set name=nick
if err := db.Model(&newUser).Where("id = ?", 3333).Update("name", "nick").Error; err != nil {
  // Handle error...
  if gorm.IsRecordNotFoundError(err) {
    db.Create(&newUser)  // Create new record from newUser
  }
}

区分 FirstOrInit 和 FirstOrCreate

虽然这两种方法具有相似的目的,但它们的行为是不同的:

  • FirstOrInit:如果记录不存在,则初始化结构体存在,但不创建记录。
  • FirstOrCreate:如果不存在则创建记录,并将记录检索到结构体。

以上是与 FirstOrCreate 和 FirstOrInit 相比,GORM 的 Upsert 功能如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn