GORM不会将布尔值字段更新为false

时间:2019-06-18 16:27:32

标签: go gorm go-gorm

updates上,gorm不会将布尔类型更新为false。默认情况下,它更新为true,但是当我尝试更新为false时不会更改。我也没有看到任何错误。可能是什么问题?

type Attendee struct {
    ID             uint   `gorm:"primary_key" gorm:"AUTO_INCREMENT" json:"id,omitempty" mapstructure:"id" csv:"ID"`
    Email          string `json:"email,omitempty" mapstructure:"email" csv:"Email,required"`

    ShowDirectory  bool   `json:"show_directory,omitempty" gorm:"default:true" mapstructure:"show_directory" csv:"-"`
}


var attendee Attendee
// JSON.unmarshal lines here for the &attendee
if err := service.DB.Model(&attendee).Updates(Attendee{
        Email:         attendee.Email,
        ShowDirectory: false
}).Error; err != nil {
    return Attendee{}, err
}

替代解决方案:

这可行,但是我要更新多个属性。所以,我不能使用它。

    att := Attendee{ID: 1}
    service.DB.Model(&att).Update("ShowDirectory", false)

4 个答案:

答案 0 :(得分:3)

另一种便捷的方法是将该字段用作指针。

请注意,所有具有零值的字段(例如0,'',false或其他零值)都不会保存到数据库中,而是会使用其默认值。如果要避免这种情况,请考虑使用指针类型或扫描仪/评估器 Link

在您的情况下,模型如下所示:

type Attendee struct {
ID             uint   `gorm:"primary_key" gorm:"AUTO_INCREMENT" json:"id,omitempty" mapstructure:"id" csv:"ID"`
Email          string `json:"email,omitempty" mapstructure:"email" csv:"Email,required"`

ShowDirectory  *bool   `json:"show_directory,omitempty" gorm:"default:true" mapstructure:"show_directory" csv:"-"`

}

答案 1 :(得分:1)

如@mkopriva所言,GORM Documentation

  

//警告:使用struct更新时,GORM将仅更新非空白值的字段

     

//对于下面的更新,不会将任何内容更新为“”,0,false are blank values of their types

     

db.Model(&user).Updates(用户{名称:“”,年龄:0,有效时间:false})

已解决:

if err := service.DB.Model(&attendee).Updates(map[string]interface{}{
    "Email":          attendee.Email,
    "ShowDirectory": false
}).Error; err != nil {
    return Attendee{}, err
}

答案 2 :(得分:0)

您应该在结构中编写gorm类型,如下所示: gorm:"type:boolean; column:column_name" 并且肯定会起作用!

答案 3 :(得分:0)

请不要使用go struct来更新非零字段,例如boolean:false

下面的代码将不会更新数据库中的Active: false,并且gorm只会忽略

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;

以下代码将更新Active: false

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

使用Map而不是go struct