栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Golang 使用gorm进行upsert

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang 使用gorm进行upsert

目录
  • Golang 使用gorm进行upsert
    • 简单应用
    • 自定义索引字段

Golang 使用gorm进行upsert

upsert 对于某个条件不同的记录,新增一个记录,如果这个条件相同,则更新一些字段。

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

简单应用
// 在 `id` 冲突时将列更新为新值
DB.Clauses(clause.OnConflict{
  Columns:   []clause.Column{{Name: "id"}}, // key colume
  // 也可以用 map [ string ] interface {} { "role" : "user" }
  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

其中新增还是更新根据指定的唯一索引字段确定。
上例中,id为主键,如果新增的记录id相同(不冲突),则不新增只更新,否则新增该记录。

支持用切片upsert多个记录,用map设置默认值

db.Clauses(clause.OnConflict{ 
 // 在 `id` 冲突时将列更新为默认值
  Columns: []clause.Column{{Name: "id" }}, 
  DoUpdates: clause.Assignments( map [ string ] interface {} { "role" : "user" }), 
}).Create(&users)  // users可以是切边
// MERGE INTO "users" USING *** WHEN NOT MATCHED THEN INSERT *** WHEN MATCHED THEN UPDATE SET ***; SQL Server 
// INSERT INTO `users` *** ON DUPLICATE KEY UPDATE ***; MySQL
自定义索引字段
DB.Clauses(clause.OnConflict{
  Columns:   []clause.Column{{Name: "key1"}, {Name: "key2"}},
  UpdateAll: true,  // 主键冲突时, 更新除主键的所有字段
}).Create(&users)

使用唯一联合索引字段 key1+key2 ,只有这两个字段联合不唯一时才新增,否则更新users表中的所有字段。
Gorm插入的记录是插入还是更新操作,是根据是否存在主键冲突来决定,当出现主键冲突时则进行更新操作(使用 ON DUPLICATE KEY UPDATE 语句后面的参数),否则进行插入操作。
所以Columns必须是唯一索引,主键索引或者其他唯一联合索引都行。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/903846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号