【问题标题】:GORM doesnt update boolean field to falseGORM 不会将布尔字段更新为 false
【发布时间】:2019-11-01 08:27:45
【问题描述】:

在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)

【问题讨论】:

  • 使用 structs 时的记录和 预期 行为,您可以为受这种奇怪 (IMO) 设计决策影响的属性使用映射. gorm.io/docs/update.html#Update-Changed-Fields(注意 cmets)
  • @mkopriva 哦,谢谢,刚刚注意到。它说false are blank values of their types 结构使用

标签: go go-gorm


【解决方案1】:

正如@mkopriva 提到的,由 GORM Documentation

// 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, "actived": false})
// UPDATE users SET name='hello', age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

注意当用struct更新时,GORM只会更新非零字段,你可能想用map来更新属性或用Select指定要更新的字段

已解决:

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

【讨论】:

    【解决方案2】:

    另一种方便的方法是将该字段设为指针。

    注意所有具有零值的字段,如 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:"-"`
    

    }

    【讨论】:

    • 我更喜欢这种方法,因为我仍然可以用我的模型更新我的记录,而不是使用map[string]interface{}。
    【解决方案3】:

    你应该在你的结构中写上 gorm 类型,像这样: gorm:"type:boolean; column:column_name" 并且肯定会奏效!

    【讨论】:

    • 检查文档,上面写着false are blank values of their types,空白值总是false
    • 下次我会尝试,当我面对它时:)
    • 不适合我。其他人可以确认这是否对他们有用吗? Gorm v1.20.12
    • 可以确认它对我也不起作用。 v1.20.12
    【解决方案4】:

    请不要使用 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

    【讨论】:

    • 你看到我的回答了吗?和我的有什么区别?
    • 你说的没有明确的解释和最好的例子和比较,我只是添加了更多的解释。您知道我遇到了同样的问题并遇到了这个问题,但是当我第一次看到您的答案时,您的回答没有帮助,因为第一眼就看到了实际的差异,相信我,对于少数用户来说,我的回答会有所帮助,并且包含很好的解释,所以我决定再写一个答案。感谢您的回答
    【解决方案5】:

    正如文档中提到的,要设置一个虚假值,您需要使用 map 或选择您需要的列。

    使用struct更新时,GORM只会更新非零字段,你可能想用map更新属性或用Select指定更新字段

    // Select with Struct (select zero value fields)
    db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
    // UPDATE users SET name='new_name', age=0 WHERE id=111;
    

    或者您可以选择所有列:

    // Select all fields (select all fields include zero value fields)
    db.Model(&user).Select("*").Update(User{Name: "jinzhu", Role: "admin", Age: 0})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多