Gorm:如何将整数列设置为空,并更新内存中的模型?

Gorm: How do I set an integer column to null, and update the model in-memory?

作为一个简单的背景,我有一个table foo,带有一个可为空的int外键bar_id。我有一个函数可以从 foo 中删除 bar 关联,也就是将其设置为 NULL.

我已经尝试了所有方法:我尝试使用 sql.NullInt64 作为列类型,然后

foo.BarId.Valid = false // even set Int64 = 0 for good measure
db.Save(&foo) // with LogMode(true)

bar_id 未在 UPDATE 语句中更新

我试过了:

db.Raw("UPDATE foo SET bar_id = NULL WHERE id = ?", foo.ID).Row().Scan(&foo)

谢天谢地,SQL 是正确的,但是对象没有更新。我认为我的 gorm 版本也没有 Error

我尝试将 Foo.BarId 的类型更改为 *int64,并将指针设置为 nil,但输出查询并未将 bar_id 更改为 NULL .

我需要做什么?

我明白了。我需要专门将该列包含在 Select():

db.Model(&foo).Select("bar_id").Updates(map[string]interface{}{"bar_id": nil})

另一种方法:

//RemoveAllChildren  remove all the children
 func RemoveAllChildren(db *gorm.DB, dataEdit Mat) (Mat, error) {
     var matupdate Mat
     db.Where("id = ?", dataEdit.ID).First(&matupdate)
     if err := db.Model(&matupdate).Update("children_mat", gorm.Expr("NULL")); err != nil {
             return matupdate, errors.New("cannotUpdate")
     }
     return matupdate, nil
 }

参考:https://gist.github.com/thanhtungka91/186dca4cd14d30581bb98193153a55bf

您也可以使用 gorm.Expr("NULL"),如下所示:

db.Model(&foo).Select("bar_id").Updates(map[string]interface{}{"bar_id": gorm.Expr("NULL")})

您也可以在 datetime 数据库字段类型上使用它。