登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-12 18:09:38 241浏览 收藏

你在学习Golang相关的知识吗?本文《GORM 不会将布尔字段更新为 false》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

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)

解决方案


正如 @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
}

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

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

到这里,我们也就讲完了《GORM 不会将布尔字段更新为 false》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>