go 如何给数据库字段设置 null 值

19 小时 25 分钟前
 ultimate42

写了个 patch 方法,因此我希望如果没有传入这个字段,则不更新这个字段的值,如果将这个字段显式设置为 null ,则将数据库的值更新为 null ,用指针的话好像也没办法区分 nil 和 null ,有什么好办法能解决这个问题吗?

459 次点击
所在节点    Go 编程语言
10 条回复
sthwrong
18 小时 51 分钟前
给定一个不会传的默认值就行了。
Charlie17Li
18 小时 48 分钟前
1. grom 的默认行为不就是:字段如果是默认值就不会去更新吗?
2. 建议贴一下你的 model 结构体,难不成基础类型你也使用指针?类似(*bool, *string)?
ultimate42
18 小时 45 分钟前
@Charlie17Li 我用的是 sqlc ,有些基础类型确实用的是指针,因为我还要传零值和""进来
niubilewodev
17 小时 31 分钟前
你是期望区分这三种情况: 不修改,有值,NULL
只用类型来区分,应该做不到。
倒是 Map 装一切可以用 contain key 来区分是不修改还是置为 NULL
ultimate42
17 小时 15 分钟前
vultr
17 小时 7 分钟前
我是在 patch 方法里多传个 attrsName ...string ,如果你确定要改,不是有效值的都是 nil 了。
everhythm
15 小时 46 分钟前
看你用的 db 库支持哪种,另起新的类型

比如 pgx 支持 pgtype.Text 显示设置存入为 null
loading
15 小时 44 分钟前
零值问题,我感觉 go 这方面是挺难受的。
我上一次就是硬着头写了个函数,里面直接拼接跑的 SQL 语句。因为那是工作上的屎山。

如果自己的业余项目,我没想到优雅的方法。
ultimate42
15 小时 17 分钟前
@everhythm 我用的 sqlc 倒是支持这个,但我现在全用的指针,感觉是我的 sql 有问题,似乎不应该这么写,我现在写的就算我判断到了 null 也没法往数据库里填

-- name: UpdateMenu :exec
UPDATE sys_menus
SET name = coalesce(sqlc.narg('name'), name),
path = coalesce(sqlc.narg('path'), path),
type = coalesce(sqlc.narg('type'), type),
sort = coalesce(sqlc.narg('sort'), sort),
status = coalesce(sqlc.narg('status'), status),
parent_id = coalesce(sqlc.narg('parent_id'), parent_id)
WHERE id = sqlc.arg('id');
ultimate42
9 小时 56 分钟前
参考这篇文章勉强实现了 https://www.calhoun.io/how-to-determine-if-a-json-key-has-been-set-to-null-or-not-provided/

parent_id = CASE WHEN @update_parent_id::boolean THEN @parent_id ELSE parent_id END

// dto
type UpdateMenuRequest struct {
...
ParentID utils.NullInt32 `json:"parent_id" binding:"omitempty"`
}

// bindJson
c.ShouldBindJSON(&req)

menu := sqlc.UpdateMenuParams{
Name: req.Name,
...
ID: id,
}

// Set 为 true 时表示显式设置了值(null 或者 其他有效值),设置 UpdateParentID 为 true 来更新数据
if req.ParentID.Set {
menu.UpdateParentID = true
menu.ParentID = nil
if req.ParentID.Valid {
menu.ParentID = &req.ParentID.Value
}
}

真是挺蛋疼的...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1156260

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX