【问题标题】:Boolean fields not getting updated布尔字段未更新
【发布时间】: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 中不是一个好的策略,因为许多零值也是有效值,无法判断是否设置了零值。作者做出了他们的选择,它就是这样......但这只是一个猜测,如果你想真正知道你应该问他们。

标签: sql go go-gorm


【解决方案1】:

您不能使用 struct 更新零值(您应该改用映射)。 From the doc:

更新多列更新支持使用 struct 或 map[string]interface{},用struct更新时只会更新 默认非零字段

// Update attributes with `struct`, will only update non-zero fields
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;

// Update attributes with `map`
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

注意当使用 struct 更新时,GORM 只会更新非零字段, 您可能想使用地图来更新属性或使用选择来 指定要更新的字段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多