问题描述
我正在使用gorm,我有一个可为空的列gender
,可以将其设置为male
或female
,但是我无法将其设置回{{1} }将列设置为NULL
或nil
male
以下是我的代码。为了简化起见,我只包含与我的问题相关的字段
female
然后我将性别更新为男性:
type User struct {
gorm.Model
Username string `gorm:"type:varchar(40);unique" json:"username"`
NickName string `gorm:"type:varchar(32)" json:"nickname"`
Gender *string `gorm:"type:enum('male','female');default:null" json:"gender"`
}
然后我尝试将性别更新为NULL
db.Model(&User{}).Where(&User{
Model: gorm.Model{ID: 1},}).Update(
&User{
Gender: utils.GetStringPtr("female"),NickName: "nick name",},)
但是,性别保持不变db.Model(&User{}).Where(&User{
Model: gorm.Model{ID: 1},}).Update(
&User{
Gender: nil,)
,并且不更改为female
。
有什么想法可以解决这个问题吗?
解决方法
您必须使用null package
。
例如:
type User struct {
gorm.Model
Username string `gorm:"type:varchar(40);unique" json:"username"`
NickName string `gorm:"type:varchar(32)" json:"nickname"`
Gender null.String `gorm:"type:enum('male','female');default:null" json:"gender"`
}
然后将set元素设置为null,您必须执行以下操作:
gender := null.StringFromPtr(nil)
必须从代码中执行以下操作:
db.Model(&User{}).Where(&User{
Model: gorm.Model{ID: 1},}).Update(
&User{
Gender: null.StringFromPtr(nil),NickName: "nick name",},)
,
从官方文档中,我发现了这个 http://gorm.io/docs/update.html
// Update multiple attributes with `struct`,will only update those changed & non blank fields
db.Model(&user).Updates(User{Name: "hello",Age: 18})
//// UPDATE users SET name='hello',age=18,updated_at = '2013-11-17 21:34:10' WHERE id = 111;
// WARNING when update with struct,GORM will only update those fields that with non blank value
// For below Update,nothing will be updated as "",false are blank values of their types
db.Model(&user).Updates(User{Name: "",Age: 0,Actived: false})
如果我这样做:
db.Model(&user).Updates(map[string]interface{"gender": nil})
这可以成功地将模型列更新为NULL。
但是,我意识到这有点不好,因为如果将bool列设置为True
,则意味着我将永远无法使用结构更新将其设置回False
。有什么办法可以解决此问题?这个的设计目的是什么。