本文介绍: upsert操作对于插入一条数据而言的,如果插入数据之前,没有这条数据,则会插入该条数据;如果插入数据之前就存在这条数据索引值),就更新这条记录

GORM支持数据库upsert操作

upsert操作对于插入一条数据而言的,如果插入数据之前,没有条数据,则会插入该条数据;如果插入数据之前就存在条数据(索引值),就更新这条记录

创建结构

type User struct {
	gorm.Model
	Identity string `json:"identity" gorm:"uniqueIndex:idx_identity"`
	Name     string `json:"name"`
	Info     string `json:"info"`
}

代码演示

user := models.User{
		Identity: "zhangsan123",
		Name:     "zhangsan",
		Info:     "zhangsanInfo",
}

res := DB.Clauses(clause.OnConflict{
	Columns: []clause.Column{{Name: "identity"}},
	DoUpdates: clause.Assignments(
		map[string]interface{}{"identity": user.Identity, "name": user.Name, "info": user.Info}),
}).Create(&user).Error
if res != nil {
	log.Printf("UpsertUser Create err:%vn", res)
} else {
	log.Printf("UpsertUser Create successn")
}

数据库新增一条数据

在这里插入图片描述

第二次执行

user := models.User{
		Identity: "zhangsan123",
		Name:     "张三",
		Info:     "mine",
}

数据库更新数据

在这里插入图片描述

出现问题

假设将原来的数据软删除,重新进行修改操作:将名字设置为’李四’,那么是插入一条新的数据还是更新原来数据?
在这里插入图片描述
结果发现直接更新了已经被GORM软删除的数据
在这里插入图片描述

原因

究其原因是因为在进行upsert语句时候需要根据唯一索引(Columns字段)进行更新,由于唯一索引限制,不能实现插入一条新的数据。

如何实现直接插入一条新的数据而不是更新已经删除的数据:将GORM软删除字段加入成为一个联合索引
在这里插入图片描述

修改后的结构

type User struct {
	gorm.Model
	DeletedAt gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:idx_identity"`
	Identity  string         `json:"identity" gorm:"uniqueIndex:idx_identity"`
	Name      string         `json:"name"`
	Info      string         `json:"info"`
}

代码也要将Columns的条件进行修改

// 定义数据
user := models.User{
	Identity: "zhangsan123",
	Name:     "张三",
	Info:     "mine",
}

res := DB.Clauses(clause.OnConflict{
	//加上联合索引的所有字段
	Columns: []clause.Column{{Name: "identity"}, {Name: "deleted_at"}},
	DoUpdates: clause.Assignments(
		map[string]interface{}{"identity": user.Identity, "name": user.Name, "info": user.Info}),
}).Create(&user).Error
if res != nil {
	log.Printf("UpsertUser Create err:%vn", res)
} else {
	log.Printf("UpsertUser Create successn")
}

在这里插入图片描述

原文地址:https://blog.csdn.net/m0_58121644/article/details/134746180

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_46710.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注