Golang Gorm 更新字段 save update updates

更新和删除操作的前提条件都是要在找到数据的情况下,先要查询到数据才可以做操作。

更新的前提的先查询到记录,Save保存所有字段,用于单个记录的全字段更新它会保控所有字段,即使零值也会保存。

在更新和删除之前,要利用之前学的查询语句先查询到数据,再去更新,也就是使用find take先去查询所需要的记录,再去更新!

save 单条记录所有字段更新


用于单条记录的全部字段更新,它会保留所有字段,即使0值也会去更新。

db.Debug().Save(&s)

UPDATE `student` SET `name`='test',`age`=60,`email`='123@qq.com' WHERE `id` = 7

可以看到会更新零值和多个字段。

Go 复制代码
	var s Student
	db.Debug().Take(&s, "name = ?", "test")
	fmt.Println(s)
	s.Age = 60
	db.Debug().Save(&s)
	fmt.Println(s)

[1.423ms] [rows:1] SELECT * FROM `student` WHERE name = 'test' LIMIT 1
{7 test 110 0xc000209140}                                                                         
                                                                                                                      
[5.531ms] [rows:1] UPDATE `student` SET `name`='test',`age`=60,`email`='123@qq.com' WHERE `id` = 7
{7 test 60 0xc000209140} 

Select只更新某个字段


只更新某个字段 select + save select是字段的名字name,不是Name

Go 复制代码
	var s Student
	db.Debug().Take(&s, "name = ?", "test")
	s.Age = 50
	db.Debug().Select("age").Save(&s)
	fmt.Println(s)

[2.220ms] [rows:1] SELECT * FROM `student` WHERE name = 'test' LIMIT 1
[8.689ms] [rows:1] UPDATE `student` SET `age`=50 WHERE `id` = 7 

update 更新单个字段


Go 复制代码
	var s []Student
	db.Debug().Find(&s, []int{1, 2, 3}).Update("age", 10)
	fmt.Println(s)

[1.258ms] [rows:3] SELECT * FROM `student` WHERE `student`.`id` IN (1,2,3)
                      
[7.232ms] [rows:3] UPDATE `student` SET `age`=10 WHERE `student`.`id` IN (1,2,3) AND `id` IN (1,2,3)
[{1 lucas 10 <nil>} {2 lucas 10 <nil>} {3  10 <nil>}] 

更新多个字段 updates


save是批量更新字段,但是想更新某个字段,updates可以接受结构体类型和map类型。

Go 复制代码
	var s []Student
	db.Debug().Find(&s, []int{1, 2, 3}).Updates(&Student{Age: 66})
	fmt.Println(s)

[6.909ms] [rows:3] UPDATE `student` SET `age`=66 WHERE `student`.`id` IN (1,2,3) AND `id` IN (1,2,3)
[{1 lucas 66 <nil>} {2 lucas 66 <nil>} {3  66 <nil>}]  
Go 复制代码
	var s []Student
	db.Debug().Find(&s, []int{1, 2, 3}).Updates(map[string]any{
		"name": "lucas",
	})

[4.648ms] [rows:1] UPDATE `student` SET `name`='lucas' WHERE `student`.`id` IN (1,2,3) AND `id` IN (1,2,3)
[{1 lucas 66 <nil>} {2 lucas 66 <nil>} {3 lucas 66 <nil>}]  
相关推荐
Wang's Blog3 小时前
Go-Zero项目开发40: 基于Jaeger的分布式链路跟踪实战
开发语言·分布式·golang
TDengine (老段)3 小时前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
Wang's Blog6 小时前
Go-Zero项目开发38:深入限流器实现与应用
开发语言·golang·go-zero
xcLeigh6 小时前
Go入门:main包与main函数的特殊地位
开发语言·后端·golang
Wang's Blog9 小时前
Go-Zero项目开发39: 熔断、限流与降级的高可用实践
开发语言·后端·golang·go-zero
FfHUCisI9 小时前
快速排序(Quick Sort)
golang
高铭杰10 小时前
Golang sync.Mutex实现原理学习
java·学习·golang
JL1510 小时前
Java 分层架构迁移到 Go:controller/service/dao 怎么落?
java·架构·golang
ttwuai1 天前
AI 生成后台改数据后,操作日志别只记按钮:Go + MySQL 怎么验
数据库·人工智能·mysql·golang
Wang's Blog1 天前
Go-Zero项目开发34: 微服务超时控制与重试机制实践
开发语言·微服务·golang·go-zero