【问题标题】:nil does not set database record to NULLnil 不会将数据库记录设置为 NULL
【发布时间】:2020-08-17 11:52:51
【问题描述】:

我正在使用 gorm,并且我有一个可以为空的列 gender,可以设置为 malefemale,但我无法在列后使用 nil 将其设置回 NULL设置为 malefemale

以下是我的代码。为了简化一点,我只包括与我的问题相关的字段

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"`
}

然后我将我的性别更新为男性:

db.Model(&User{}).Where(&User{
    Model: gorm.Model{ID: 1},
}).Update(
    &User{
        Gender:   utils.GetStringPtr("female"),
        NickName: "nick name",
    },
)

然后我尝试将性别更新为 NULL

db.Model(&User{}).Where(&User{
    Model: gorm.Model{ID: 1},
}).Update(
    &User{
        Gender:   nil,
        NickName: "nick name",
    },
)

但是,性别保持不变female,并且改为NULL

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 您想阻止设置null 吗?或者你不能设置null?
  • @ttrasn,我无法将其设置为 null,我想知道如何将其设置回 NULL

标签: go go-gorm


【解决方案1】:

从官方文档中,我找到了这个 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 "", 0, 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,这意味着我将永远无法使用 struct update 将其设置回 False。有没有办法解决这个问题?这样做的设计目的是什么。

【讨论】:

  • 我建议你不要使用interface{}。它不是您代码的最佳解决方案。
  • 但是根据文档,使用 struct update 不会更新零值,这里的最佳做法是什么?
  • 查看 ttrasn 的回答。 stackoverflow.com/a/63433706/5902688
【解决方案2】:

您必须使用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"`
}

然后将元素设置为 null 你必须这样做:

gender := null.StringFromPtr(nil)

从您的代码中,您必须这样做:

db.Model(&User{}).Where(&User{
    Model: gorm.Model{ID: 1},
}).Update(
    &User{
        Gender:   null.StringFromPtr(nil),
        NickName: "nick name",
    },
)

【讨论】:

  • 我尝试了这个解决方案,我按照您的建议更新了我的性别字段,并尝试使用 gender := null.StringFromPtr(nil) 将性别设置为 NULL,性别仍然没有更新跨度>
  • 我正在使用:github.com/jinzhu/gorm v1.9.15 gopkg.in/guregu/null.v4 v4.0.0 go version go1.14.7 darwin/amd64
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多