首页 > 解决方案 > 布尔字段未更新

问题描述

我正在尝试通过使用来自 gorm的更新批处理我的请求中的所有更改来更新我的整个数据库。除布尔值外,所有字段都在更新。数据库也没有抛出错误。

这是我的结构

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 指定要更新的字段

可能是什么问题?解决办法是什么?

标签: sqlgogo-gorm

解决方案


您不能使用 struct 更新零值(您应该使用地图)。从文档

更新多列更新支持用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 只会更新非零字段,您可能希望使用 map 更新属性或使用 Select 指定要更新的字段


推荐阅读