GORM 不会将布尔字段更新为 false
GORM doesnt update boolean field to 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;
NOTE When update with struct, GORM will only update non-zero fields, you might want to use map
to update attributes or use Select
to specify fields to update
已解决:
if err := service.DB.Model(&attendee).Updates(map[string]interface{}{
"Email": attendee.Email,
"ShowDirectory": false
}).Error; err != nil {
return Attendee{}, err
}
你应该在你的结构中写 gorm 类型,像这样:
gorm:"type:boolean; column:column_name"
肯定会奏效!
另一种方便的方法是将该字段作为指针。
注意所有具有零值的字段,如 0、''、false 或其他零值,不会保存到数据库中,但会使用其默认值。如果您想避免这种情况,请考虑使用指针类型或 scanner/valuerLink
在你的例子中,模型看起来像:
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:"-"`
}
请不要使用 go struct 来更新 non-zero 字段,例如 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;
Use Map instead of go struct
如文档中所述,要设置虚假值,您需要使用 map
或 select 您需要的列。
When update with struct, GORM will only update non-zero fields, you might want to use map to update attributes or use Select to specify fields to update
// 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 所有列:
// Select all fields (select all fields include zero value fields)
db.Model(&user).Select("*").Update(User{Name: "jinzhu", Role: "admin", Age: 0})
只需添加`Select(*)
db.Model(&user).Select("*").Update(User{Name: "jinzhu", Role: "admin", Age: 0})
这种方式比其他方式简单多了。
在 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;
NOTE When update with struct, GORM will only update non-zero fields, you might want to use
map
to update attributes or useSelect
to specify fields to update
已解决:
if err := service.DB.Model(&attendee).Updates(map[string]interface{}{
"Email": attendee.Email,
"ShowDirectory": false
}).Error; err != nil {
return Attendee{}, err
}
你应该在你的结构中写 gorm 类型,像这样:
gorm:"type:boolean; column:column_name"
肯定会奏效!
另一种方便的方法是将该字段作为指针。
注意所有具有零值的字段,如 0、''、false 或其他零值,不会保存到数据库中,但会使用其默认值。如果您想避免这种情况,请考虑使用指针类型或 scanner/valuerLink
在你的例子中,模型看起来像:
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:"-"`
}
请不要使用 go struct 来更新 non-zero 字段,例如 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;
Use Map instead of go struct
如文档中所述,要设置虚假值,您需要使用 map
或 select 您需要的列。
When update with struct, GORM will only update non-zero fields, you might want to use map to update attributes or use Select to specify fields to update
// 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 所有列:
// Select all fields (select all fields include zero value fields)
db.Model(&user).Select("*").Update(User{Name: "jinzhu", Role: "admin", Age: 0})
只需添加`Select(*)
db.Model(&user).Select("*").Update(User{Name: "jinzhu", Role: "admin", Age: 0})
这种方式比其他方式简单多了。