Golang Gorm 更新字段 save、update、updates

这篇具有很好参考价值的文章主要介绍了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

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

	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} 

gorm 批量更新,Golang Gorm,golang

Save + Select 只更新某个字段


gorm 批量更新,Golang Gorm,golang

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

	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 更新单个字段 find+update、take+update、model+where+update


gorm 批量更新,Golang Gorm,golang

model 是声明映射关系的对象类型,通过这个对象类型,找到表名和字段 

	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>}] 

Take + Update 

var s Student
db.Debug().Take(&s, "name = ?", "lucas").Update("age", 18)

UPDATE `student` SET `age`=18 WHERE name = 'lucas' AND `id` = 3 LIMIT 1

Model + Where + Update 

model() 括号里面是一个结构体指针,通过该结构体找到对应的表! 

var s Student
db.Debug().Model(&s).Where("name = ?", "lucas").Update("age", 106)

[7.091ms] [rows:1] UPDATE `student` SET `age`=106 WHERE name = 'lucas'

 

更新多个字段 updates  Model(&x{}) + Where + Updates


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

updates之前,你必须先查找,你这里可以使用take + updates,find + updates,model + where等等,updates里面是具体的结构体即可。 

gorm 批量更新,Golang Gorm,golang

	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>}]  
	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>}]  

实际使用中的一段代码文章来源地址https://www.toymoban.com/news/detail-770369.html

	if err := mysql.DB.Model(&model.Book{}).Where("id = ?", book.ID).Updates(book).Error; err != nil {
		logger.Error(fmt.Sprintf("更新book失败:%v", err))
		return errors.New(fmt.Sprintf("更新book失败:%v", err))
	}

到了这里,关于Golang Gorm 更新字段 save、update、updates的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang通过Gorm操作Mysql时遇到的datetime时区问题

    golang使用Gorm操作MySQL,MySQL中数据类型是datetime,Golang中用的是time.now。 但是会导致存储的时间与北京时间有8h误差, 显然是没有初始化时区导致。 参考我自己之前写过的一篇总结——Mysql中多种日期类型——DATETIME、TIMESTAMP、TIME、YEAR、DATE的区分 datetime是给什么就存什么,

    2024年01月20日
    浏览(36)
  • golang gorm通过泛型实现通用单表增删改

    无废话,直接上代码 调用方式 给出调用方式案例 可以依照代码,写出其它灵活的使用方式 结束

    2024年02月05日
    浏览(35)
  • Golang+Gorm库使用踩坑——未标识primarykey导致创建后无法返回修改

    做毕设ing,基本的增删改查。 这里是一个需要增的地方,代码如下: 我在外层调用时候,是需要返回新增记录的ID。但是无法符合预期。通过打印发现,我这里返回的id就是0。 翻阅之前写的一个正确样例,对比发现 区别在于,我这里没有去指定主键。 根据官方文档,其de

    2024年01月19日
    浏览(38)
  • golang-gin-mysql转gorm-struct--gen-model

    背景 :python-django项目用go-gin重构,数据库已存在,gin中使用gorm 所以需要工具将mysql数据库中的表结构转到orm的model中。 前提:因为国内访问github需要稳定的代理 Goproxy.cn  推荐这个 1.在项目路径中下载gen-model模块  go get -u github.com/DaoYoung/gen-model # GOBIN 目录下会有一个gen-model

    2024年02月09日
    浏览(35)
  • [Golang实战] gorm中使用Raw()和 Exec() 两种方式操作sql原生语句的特点和区别

    当我在gorm中使用原生sql操作数据库时,时常用raw() 和 exec() ,有时候经常遇到数据插不进去或者 数据帮i当不到结构体,原来是 这两个方法有不同的用处和特点 个人理解: 需要查询数据 映射到结构体时使用 官方理解: DB.Raw() 方法用于执行原始 SQL 查询语句或可执行的命令。

    2024年02月13日
    浏览(47)
  • Mybatis之批量更新数据(批量update)

    前言 当我们使用mybatis的时候,可能经常会碰到一批数据的批量更新问题,因为如果一条数据一更新,那每一条数据就需要涉及到一次数据库的操作,包括网络IO以及磁盘IO,可想而知,这个效率是非常低下的。而平时我们很少直接使用原生jdbc直接操作数据库,而是会使用比较

    2024年02月11日
    浏览(42)
  • ES update_time 字段 更新时间

    search_key_word : time 写入精度 update_time 字段 更新时间 在 5.0 版本之前可以开启 _timestamp 元数据字段,会自动为文档添加一个时间戳,但此元数据字段已在 2.x 版本过时,5.x 版本移除 (release nodes) 在 5.x 及之后的版本中可以利用 pipeline 为文档写入 es 时添加一个时间戳字段来达到同

    2024年02月15日
    浏览(36)
  • SpringBoot中使用@Insert、@Update实现批量新增、更新

    数据库原始表数据 数据层接口 注意 : @Param(“list”) 引号中和foreach 中 collection 属性值必须写list,否则报错。item属性值写实体类的类名,首字母必须小写 接口测试: 由于在Apifox中是没有对应List的数据类型因此需要我们自己手写body形式 – json例如: 除了使用接口测试工具验证

    2024年02月09日
    浏览(45)
  • Elasticsearch更新指定字段操作_update_by_query

    MYSQL语句:update index_name set name = ‘wb’ where id = ‘20132112534’; MYSQL语句:update index_name set name = ‘wb’ where (a_time - b_time = 100000) MYSQL语句:update index_name set sort_time = update_time where sort_time is null;

    2024年02月11日
    浏览(38)
  • django 批量创建bulk_create和批量更新bulk_update

    以创建1万个对象为例,相比save() 循环和save() 事务,bulk_效率是save()循环保存的百倍,是事务处理的近10倍: 用法: 用法:

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包