GORM更新操作(Save、Update、Updates)

news2024/11/15 4:49:23

在 Go 语言的 Web 开发中,GORM 是一个广泛使用的 ORM (Object-Relational Mapping) 框架。它提供了一种流畅的方式来处理数据库的交互,其中包括记录的更新操作。GORM中的更新操作主要是update、updates、save这几种

操作前的准备工作:声明模型,连接数据库

使用gorm对数据库中的数据进行修改,首先我们需要一个与表中字段、表名相对应的结构体,我们以一个User结构体来举例

声明模型

// User 定义了用户模型,对应数据库中的 user 表
type User struct {
	Id           int    `gorm:"column:id" json:"id"`
	UserName     string    `gorm:"column:userName" json:"userName"`                               // 用户昵称
	UserPassword string `gorm:"column:userPassword;not null" json:"userPassword"` // 密码
	UserEmail    string `gorm:"column:userEmail" json:"userEmail"`                //用户邮箱
	UserProfile  string    `gorm:"column:userProfile" json:"userProfile"`                         // 用户简介
	IsDelete     int8      `gorm:"column:isDelete;default:0;not null" json:"isDelete"`            // 是否删除}

// TableName 指定 User 模型对应的数据库表名
func (User) TableName() string {
	return "user"
}

其中column指的是该数据库表中对应的列名,“user”是表名

连接数据库


func main() {
    // 连接数据库
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
 
    // 创建一个用户
	    user := &User{
	    UserName: "John", 
	    UserPassWord:"123456",
	    UserEmail:"123@234.com",
	    UserProfile:"一个用户~"
	    }
    result := db.Create(user)
    if result.Error != nil {
        panic("failed to create user")
    }

}

Save-- 保存所有列

Save 会保存所有的字段,即使字段是零值;保存是一个组合函数。 如果保存值不包含主键,它将执行 Create,否则它将执行 Update (包含所有字段)。

db.Save(&User{UserName: "John", UserPassWord:"123456",UserEmail:"123@234.com"}
/*等同于:INSERT INTO `users` (`userName`,`userPassword`,`userEmail`,`userProfile`,`isDelete`)
 VALUES ("John","123456","123@234.com","",0)*/

Update – 更新单个列

当使用 Update 更新单列时,需要有一些条件,否则将会引起ErrMissingWhereClause 错误,当使用 Model 方法,并且它有主键值时,主键将会被用于构建条件,例如:

// 根据条件更新
db.Model(&User{}).Where("userName = ?", "JONE").Update("userPassword", "987654")
// UPDATE users SET userPassword='987654', WHERE userName =JONE;

// User 的 ID 是 `1`
db.Model(&user).Update("userName ", "JONE")
// UPDATE users SET userName ='JONE',WHERE id=1;

Update 方法返回了一个 gorm.DB 类型的结果,通过检查 Result.Error 和 Result.RowsAffected 属性,我们可以确定更新操作是否成功执行。

Updates --更新多个列

除了更新单个字段之外,我们还可以使用 Update 方法同时更新多个字段。这可以通过传递一个包含多个键值对的地图作为参数来实现。
Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新时,默认情况下GORM 只会更新非零值的字段

db.Save(&User{UserName: "John", UserPassWord:"123456",UserEmail:"123@234.com"}
/*等同于:INSERT INTO `users` (`userName`,`userPassword`,`userEmail`,`userProfile`,`isDelete`)
 VALUES ("John","123456","123@234.com")*/

处理错误

这里插入一个在使用过程中遇到的一个小问题:
当我们使用Add()来向数据库添加数据时,如果插入的数据违反了唯一键约束,就会返回错误:

Duplicate entry

GORM官方网站对于这个错误的处理是使用ErrDuplicatedKey
在这里插入图片描述
但是通过测试发现这个并不能捕捉到违反唯一键约束的错误,通过修改发现可以使用如下的方法:

if err != nil {
		if strings.Contains(err.Error(), "Duplicate") {
			//处理违反唯一键约束错误
			return
		}
		//处理其他错误
		return
	}

其他的错误例如ErrRecordNotFound也可以使用这种方式来捕捉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言进阶版第五课—函数递归

文章目录 1. 什么是函数递归2. 函数递归的思想3. 函数递归的限制4. 函数递归练习4.1 n的阶乘4.2 按照顺序打印一个整数的每一位4.3 自定义函数不允许创建变量,求字符串长度 1. 什么是函数递归 函数递归就是函数自己调用自己 图片中的函数test(&#xff0…

Monaco 使用 TypeDefinitionProvider

Monaco 中的 TypeDefinitionProvider 和 ImplementationProvider、DefinitionProvider 类似,右键点击变量名称,现在 “选择转到类型定义”, 跳到指定位置。 通过 registerTypeDefinitionProvider 添加 TypeDefinitionProvider 处理方法 实现…

力扣SQL50 按日期分组销售产品 group_concact

Problem: 1484. 按日期分组销售产品 👨‍🏫 参考题解 select sell_date, count(distinct product) num_sold,group_concat(distinct product order by productseparator ,) products from activities group by sell_date

度量与增长——OrionX AI算力管理工具的企业价值解读

从科学计算到人工智能,从AI模型开发到AI模型训练,从双精度到半精度,从OPENGL到CUDA,GPU都扮演着关键角色。本文主要从运维的人员的角度出发,来探讨GPU使用过程中遇到的管理问题和创新性解决办法。 GPU的管理和监控 相…

《电容-排容》

节省电路板空间:将多个电容集成在一个封装里,减小了占用的电路板面积。 便于安装和布线:提高生产效率和电路布局的便利性。 一致性较好:由于是同一批次生产,各电容的性能参数较为一致。 【参数】品牌,封…

网络云相册实现--nodejs后端+vue3前端

目录 主页面 功能简介 系统简介 api 数据库表结构 代码目录 运行命令 主要代码 server apis.js encry.js mysql.js upload.js client3 index.js 完整代码 主页面 功能简介 多用户系统,用户可以在系统中注册、登录及管理自己的账号、相册及照片。 每…

Maven实战(四)- 生命周期和插件

Maven实战(四)- 生命周期和插件 文章目录 Maven实战(四)- 生命周期和插件1.何为生命周期2.生命周期2.1.Clean生命周期2.1.Default生命周期2.3.Site生命周期 3.Maven插件3.1.插件目标3.2.插件绑定3.2.1.内置插件3.2.2.自定义插件 4…

算法学习day28

一、寻找右区间(二分法) 题意:题目很容易理解 但是转换为二分法有点晦涩 给你一个区间数组 intervals ,其中 intervals[i] [starti, endi] ,且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j ,并满足 startj > e…

gptpdf深度解析:开源文档处理技术全攻略

目录 一、引言二、gptpdf 是什么?三、gptpdf 的功能特性1. 精准的 PDF 元素解析能力2. 对复杂文档结构的处理示例3. 高效的处理速度4. 低成本的优势 四、gptpdf 应用场景1. 学术研究与文献处理2. 企业文档管理3. 软件开发中的文档转换 五、gptpdf 代码示例1. 基本的…

【Vue3】组件通信之v-model

【Vue3】组件通信之v-model 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的…

图像梯度与几种算子

“滤波器”也可以称为“卷积核”,“掩膜”,“算子”等。 1、Sobel算子 Sobel算子是一个33的卷积核,利用局部差分寻找边缘,计算得到梯度的近似值。x和y方向的Sobel算子分别为: 梯度有方向,对于一个图像&a…

电子元器件—三极管(一篇文章搞懂电路中的三极管)(笔记)(面试考试必备知识点)

三极管的定义及工作原理 1. 定义 三极管(Transistor)是一种具有三层半导体材料(P-N-P 或 N-P-N)构成的半导体器件,用于信号放大、开关控制和信号调制等应用。三极管有三个引脚:发射极(Emitter…

SpringBoot智慧旅游在线平台的设计与实现(源码+论文+部署讲解等)

博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HLM…

从地铁客流讲开来:地铁客运量特征

1.数据来源 数据来源:MetroWatch地铁观察 | 地铁客流量数据 在做城市地铁客流数据的整理及可视化这块其实国内已经有很多大牛一直在做无偿免费的更新,其中覆盖多城市且每日更新数据的主要有两个:一个是地铁数据库 | 地铁客流量查询 (metrod…

数字农业农村云平台整体规划建设方案PPT

数字农业农村云平台的规划建设方案是一个全面而复杂的项目,涉及到多个方面的整合与创新。根据搜索结果,以下是一些关键点: 资料下载方式,请看每张图片右下角信息 1. 组织领导与政策支持:加强组织领导,确保…

如何在联络中心使用人工智能驱动的语音分析?

人工智能驱动的语音分析是一种使用自然语言处理和机器学习技术的语音识别软件。借助呼叫中心的语音分析,您可以将实时语音转换为文本。之后,程序会评估此文本以揭示有关客户需求、偏好和情绪的详细信息。 在联络中心,语音分析工具有助于&…

OpenCV函数

1,cv2.imread cv2.imread:这个函数可以直接用cv2.imread(filename, cv2.IMREAD_GRAYSCALE)直接将图片以黑白图像输入,也可以通过cv2.imread(img, 0)来将图片以黑白图像输入。其实这两者是一样的,如下图所示,可以将特定的颜色通道…

C语言程序设计之结构体篇2

程序设计之结构体2 问题2_1的代码2_1结果2_1 问题1_2代码1_2结果1_2 问题1_3代码1_3结果1_3 问题1_4代码1_4结果1_4 问题2_1的 函数 f u n fun fun 的功能是&#xff1a; 对 N N N 名学生的学习成绩&#xff0c;按从高到低的顺序找出前 m m m &#xff08; m < 10 m<1…

『 C++11 』模板可变参数包,Lambda表达式与 function 包装器

文章目录 模板可变参数模板可变参数包的展开可变参数包与STL容器中的emplace函数关系 Lambda 表达式function 包装器function 包装器对成员函数的包装bind 绑定 模板可变参数模板 可变参数模板是C11引入的一个特性,允许模板接收任意数量的参数; 该特性增加了C的泛型编程能力; 可…

搭建jenkins一键部署java项目

一、搭建jenkins 链接: https://pan.baidu.com/s/1jzx15PiyI8EhLd_vg7q8bw 提取码: ydhl 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 直接使用docker导入镜像&#xff0c;运行就好 docker run -di --name jenkins -p 8080:8080 -v /home/jenkins_home:/var/je…