Golang Go语言中gorm结构体方式查询更新等操作忽略零值这个事儿影响不大吗?
Golang Go语言中gorm结构体方式查询更新等操作忽略零值这个事儿影响不大吗?
譬如 bool 值 这种 false 是很常见的一种操作.
在实际的开发中,如何处理这种情况. 都定义成指针? 还是 都用 map 更新?
最佳实践是什么?
谢谢大佬.
应该用指针吧
更多关于Golang Go语言中gorm结构体方式查询更新等操作忽略零值这个事儿影响不大吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可以用 select 指定吧
这个确实很难受。目前是禁止用 Updates,都用 Save 、Select 等。
明白. 谢谢.
没太明白,是数据库没有设计默认 DEFAULT '0’吗?还是写 DAO 的时候没有 UpdateColumn(map)?
我遇到的场景都还是比较适合使用 map 指定更新字段的,不知道楼主的场景是怎样的。不过建议设置良好的 logger,这样可以对 gorm 的行为心里有底
开始写 go 这边的 crud 确实有这个难受的问题;
后面把结构换为指针,
塞进去的时候,判断值是否为 nil,
nil 的话就略过。
没太明白,是数据库没有设计默认 DEFAULT '0’吗?
– 就是 update 一个 bool 从 True --> false 但是因为 false 是零值所以 update 失败.
我遇到的场景都还是比较适合使用 map 指定更新字段的,不知道楼主的场景是怎样的。
– 我是 go/gorm 新手还没开始敲 go 代码. 就是看文档的时候遇到了这个说明所以很奇怪 真正的实际开发过程中是如何处理这个问题的. 我在脑子里空想 无论是指针 还是 values scan 都听麻烦的.
map 合适吗? 我不知道. 因为目前我看到的有限的 go 代码用结构体用的都挺多的.
所以上来问问有经验的大佬们.
save 不用 select 会整个 struct 全部写库,你读出的数据是有可能滞后的,导致库内数据被覆盖
#9
是滴,代码会有点脏,后续可能需要再重新统一下
但如果不这么搞,确实没好办法,挺恶心的。。。
你根本不知道你从外面塞进来的 0 是真的 0 还是默认的 0
倒是可以事务+行锁,不过就更麻烦了。你有没有好办法?
go 的破问题,感觉除了指针没什么更好的解法了
#8 哈哈,我更愿意称之为失败的 update,而不是 update 失败。零值问题手动使用 map 指定要更新的字段就好了,我想麻烦不是很多。如果你不想用 map 的方式,楼上说的 Select 也可以考虑一下。他们其实核心作用都是明明白白地告诉 ORM,你要更新的字段是哪些
结构体当然很常用呀,但我想 gorm 这边只好依着它来了。其实我之前都是手写 SQL 的,没错,手动 Scan Field 。我觉得即使是手写 SQL 工作量也不会多出来多少吧,所以也许你可以试用一下 DB.Exec() ?哈哈,祝好运
我想表达的和事物锁没有关系,我的意思是说 save 会保存整个 struct 的所有值,如果你新建,所有 0 值字段都会写入,如果你更新,所有先前读出的映射到 struct 的字段包含 struct 自带的 0 值哪怕没有修改过,都会被回写,而这些年当前业务没修改的字段在数据库可能已经被其它业务改过,你光用 save 就会导致这些业务数据回退,所以必须 save 配合 select 指定你修改的业务字段,这么麻烦还不如用 updates+map 。
用 save 前端会返回这个结构体的时候数据,偶尔会用 update map 来更新
在Go语言中使用GORM进行结构体方式查询和更新时,忽略零值(如零值的整数、字符串等)确实是一个需要注意的特性。这一行为在某些情况下可能会带来影响,但具体影响的大小取决于应用程序的具体需求和上下文。
从一方面来看,忽略零值可以避免不必要的更新操作,特别是在更新记录时,如果某些字段的值未改变(即为零值),则不会更新这些字段,这有助于减少数据库的负载,同时保持数据的稳定性。
然而,从另一方面来说,这种特性也可能导致数据不一致或意外的行为。例如,如果开发者期望更新某个字段为零值,但GORM因为忽略零值而没有执行更新,那么数据的状态可能就不符合开发者的预期。
因此,开发者在使用GORM进行结构体方式查询和更新时,需要充分了解这一特性,并根据实际需求进行处理。如果需要更新零值字段,可以考虑使用GORM提供的显式更新方法,或者使用Map或StructScan等方式来手动控制需要更新的字段。
总的来说,GORM忽略零值的特性在大多数情况下是有益的,但开发者需要在使用时保持警惕,确保数据更新符合业务逻辑和预期。通过合理的设计和使用技巧,可以最大限度地减少这一特性带来的潜在影响。