Golang Go语言中gorm结构体方式查询更新等操作忽略零值这个事儿影响不大吗?

发布于 1周前 作者 zlyuanteng 来自 Go语言

Golang Go语言中gorm结构体方式查询更新等操作忽略零值这个事儿影响不大吗?
譬如 bool 值 这种 false 是很常见的一种操作.

在实际的开发中,如何处理这种情况. 都定义成指针? 还是 都用 map 更新?

最佳实践是什么?

谢谢大佬.

18 回复

应该用指针吧

更多关于Golang Go语言中gorm结构体方式查询更新等操作忽略零值这个事儿影响不大吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


注意 当通过 struct 更新时,GORM 只会更新非零字段。 如果您想确保指定字段被更新,你应该使用 Select 更新选定字段,或使用 map 来完成更新操作

官网不是给了吗

可以用 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忽略零值的特性在大多数情况下是有益的,但开发者需要在使用时保持警惕,确保数据更新符合业务逻辑和预期。通过合理的设计和使用技巧,可以最大限度地减少这一特性带来的潜在影响。

回到顶部