当前位置: 首页 > news >正文

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

在 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也可以使用这种方式来捕捉

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 十大人力资源SAAS软件:企业管理的革新者
  • 【学术会议征稿】第三届环境遥感与地理信息技术国际学术会议(ERSGIT 2024)
  • 职业教育大数据实验实训室建设应用案例
  • 听专家的,不如听国家的,网络安全究竟值不值得报?
  • 人大高瓴发布Think-on-Graph 2.0,基于知识图的大模型推理再升级!
  • fastadmin中控制下级管理员能不能查看
  • C#与欧姆龙PLC 通信——fins udp协议
  • 高效率自动写作文章,AI写作生成器轻松为你搞定
  • 【redis】redis高可用 哨兵模式 一主二从三哨兵部署教程
  • Umi-OCR:功能强大且易于使用的本地照片识别软件
  • SQLServer设置端口(上)
  • nvm:Node.js 版本管理工具
  • 【小尘送书-第十六期】码农职场:IT人求职就业手册
  • Centos 8系统ext4文件系统类型进行扩容缩容 (LVM)
  • 探索Perl正则表达式的奥秘:复合模式的高级应用
  • SegmentFault for Android 3.0 发布
  • 【RocksDB】TransactionDB源码分析
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 345-反转字符串中的元音字母
  • download使用浅析
  • JavaScript设计模式之工厂模式
  • js写一个简单的选项卡
  • KMP算法及优化
  • 闭包,sync使用细节
  • 工程优化暨babel升级小记
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于遗传算法的优化问题求解
  • 06-01 点餐小程序前台界面搭建
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • (14)Hive调优——合并小文件
  • (C语言)fread与fwrite详解
  • (Python) SOAP Web Service (HTTP POST)
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (南京观海微电子)——I3C协议介绍
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (七)Java对象在Hibernate持久化层的状态
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十)T检验-第一部分
  • (十一)图像的罗伯特梯度锐化
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)JPA - JQPL 实现增删改查
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net framework profiles /.net framework 配置
  • .NET Remoting学习笔记(三)信道
  • .NET 发展历程
  • .NET 设计模式初探
  • .NET 中创建支持集合初始化器的类型