作为一个简单的背景,我有一个表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)
在UPDATE语句中未更新bar_id
我试过了:
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。
我该怎么办?
发布于 2019-02-15 05:19:41
这样啊,原来是这么回事。我需要明确地在Select()
中包含该列
db.Model(&foo).Select("bar_id").Updates(map[string]interface{}{"bar_id": nil})
发布于 2021-08-25 08:52:49
另一种方法:
//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
发布于 2021-09-11 02:37:43
您也可以使用gorm.Expr("NULL")
,如下所示:
db.Model(&foo).Select("bar_id").Updates(map[string]interface{}{"bar_id": gorm.Expr("NULL")})
您也可以在datetime
数据库字段类型上使用它。
https://stackoverflow.com/questions/54698391
复制相似问题