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
数据库字段类型上使用它。
作为一个简单的背景,我有一个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
数据库字段类型上使用它。