nil不会将数据库记录设置为NULL

问题描述

我正在使用gorm,我有一个可为空的列gender,可以将其设置为malefemale,但是我无法将其设置回{{1} }将列设置为NULLnil

后,使用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。有什么办法可以解决此问题?这个的设计目的是什么。