网站首页 > 技术文章 正文
本节主要来讲解的如何使用gorm来更新数据库中的数据,包括Save方法、Update方法、Updates方法使用及如何进行批量更新。
保存所有字段
可以使用save字段来更新所有字段,及时字段是零值
var user User
db, _ := GetMysqlDb("root", "123456", "192.168.188.155", 3306, "szkfpt")
db.First(&user)
user.Name = "jinzhu 2"
user.Age = 100
// UPDATE `users` SET `name`='jinzhu 2',`email`=NULL,
//`age`=100,`birthday`='2024-03-21 16:52:50.665',`member_number`=NULL,
//`activated_at`=NULL,`created_at`='2024-03-21 16:52:50.69',
//`updated_at`='2024-03-25 16:25:08.448' WHERE `id` = 1
db.Save(&user)
从上面输出的sql语句可以看到,User结构体中的所有字段都被更新了,及时字段为空也会被更新。
save方法是一个组合方法,如果保存的值不存在主键,就会进行新建!
如果存在主键,那么就会进行更新。
// INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`)
// VALUES ('jinzhu8',NULL,22,NULL,NULL,NULL,'2024-03-25 16:38:58.857','2024-03-25 16:38:58.857')
db.Save(&User{
Name: "jinzhu8",
Age: 22,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
})
// UPDATE `users` SET `name`='jinzhu',`email`=NULL,`age`=100,`birthday`=NULL,`member_number`=NULL,
//`activated_at`=NULL,`created_at`='2024-03-25 16:38:58.859',`updated_at`='2024-03-25 16:38:58.86' WHERE `id` = 1
db.Save(&User{ID: 1, Name: "jinzhu", Age: 100, CreatedAt: time.Now()})
上面的第一次的Save方法调用,由于主键Id没有赋值,所以执行了保存操作。第二次调用,由于指定ID为1,那么执行的是一个更新操作。
更新单个列
当使用 Update 更新单列时,需要有一些条件,否则将会引起ErrMissingWhereClause 错误,查看 阻止全局更新 了解详情。 当使用 Model 方法,并且它有主键值时,主键将会被用于构建条件,例如:
var user User
db, _ := GetMysqlDb("root", "123456", "192.168.188.155", 3306, "szkfpt")
// 根据条件更新
// UPDATE `users` SET `name`='hello',`updated_at`='2024-03-25 16:57:52.216' WHERE age = 18;
db.Model(&User{}).Where("age = ?", 18).Update("name", "hello")
// User 的 ID 是 1
// UPDATE `users` SET `name`='hello',`updated_at`='2024-03-25 16:57:52.227' WHERE `id` = 1
db.Model(&User{ID: 1}).Update("name", "hello")
// 根据条件和 model 的值进行更新
// UPDATE `users` SET `name`='hello',`updated_at`='2024-03-25 16:57:52.23' WHERE age = 100
db.Model(&user).Where("age = ?", 100).Update("name", "hello")
更新多列
gorm的Updates方法支持更新struct和map[string]interface{}参数,当参数是在结构体的时候,默认情况下只会更新非零值的字段
var user = User{
ID: 1,
}
db, _ := GetMysqlDb("root", "123456", "192.168.188.155", 3306, "szkfpt")
// 根据 `struct` 更新属性,只会更新非零值的字段
// UPDATE `users` SET `name`='hello',`updated_at`='2024-03-25 17:14:10.48' WHERE `id` = 1
db.Model(&user).Updates(User{Name: "hello", Age: 0})
// 根据 `map` 更新属性
// UPDATE `users` SET `age`=0,`name`='hello',`updated_at`='2024-03-25 17:14:10.494' WHERE `id` = 1
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 0})
更新选定字段
// UPDATE `users` SET `name`='hello2',`updated_at`='2024-03-25 17:33:01.714' WHERE `id` = 1
db.Model(&User{ID: 1}).Select("name").Updates(map[string]interface{}{"name": "hello2", "age": 18, "active": false})
可以通过Select方法来选定特定字段来进行更新
批量更新
db, _ := GetMysqlDb("root", "123456", "192.168.188.155", 3306, "szkfpt")
// UPDATE `users` SET `name`='hello',`age`=18,`updated_at`='2024-03-25 17:41:13.394' WHERE name = 'hello2'
db.Model(User{}).Where("name = ?", "hello2").Updates(User{
Name: "hello",
Age: 18,
})
猜你喜欢
- 2024-09-09 混合云资产管理项目(二)(混合云存储产品有哪些)
- 2024-09-09 Go语言进阶之Go语言高性能Web框架Iris项目实战-完善用户管理EP04
- 2024-09-09 数据库与 Go 的交互(go数据库和kegg数据库)
- 2024-09-09 七爪源码:N+1 查询如何烧毁您的数据库
- 2024-09-09 Go的安全编程和防御性编程(防止代码注入)
- 2024-09-09 Vue3+Go 仿抖音项目架构设计与实现
- 2024-09-09 腾讯Go安全指南(腾讯官网最新安全公告)
- 2024-09-09 Grails指南24查询高阶(grails中文参考手册)
- 2024-09-09 Redis优化高并发下的秒杀性能(redis秒杀高并发代码)
- 2024-09-09 10.Go语言编写个人博客 文章分类(基于golang的个人博客系统)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)