【发布时间】:2021-08-26 15:37:58
【问题描述】:
我正在尝试通过使用来自 gorm 的 Updates 批处理我的请求中的所有更改来更新我的整个数据库。除布尔值外,所有字段都在更新。数据库也没有抛出错误。
这是我的结构
type Client struct {
ClientID string `json:"client_id"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Email string `json:"email"`
Telephone string `json:"telephone"`
AcceptNotification bool `json:"accept_notification"`
Verfied bool `json:"verified"`
}
更新客户端的代码是
func (b *Client) UpdateClient(request models.Client) (err error) {
db := b.DB
result := db.Table("client").
Where("client_id = ? AND store_id = ?", request.ClientID, request.StoreID).
Updates(request)
if result.Error != nil {
return result.Error
}
return nil
}
在文档中说
使用struct更新时,GORM只会更新非零字段,你可能想用map更新属性或用Select指定更新字段
可能是什么问题?解决办法是什么?
【问题讨论】:
-
您是否将所有布尔字段设置为
true?因为如果不是,如果您尝试将列更新为false,那么您需要使用映射或指向布尔字段的指针,因为false是布尔类型的零值,并且正如您已经引用的那样: "GORM 只会更新非零字段" -
将指针设置为 bool 有帮助。 gorm 只更新非零字段的任何原因?
-
大概是因为作者希望通过仅发送显式设置的字段来减少数据库的负载,如果您问我,这在 Go 中不是一个好的策略,因为许多零值也是有效值,无法判断是否设置了零值。作者做出了他们的选择,它就是这样......但这只是一个猜测,如果你想真正知道你应该问他们。