写了个 patch 方法,因此我希望如果没有传入这个字段,则不更新这个字段的值,如果将这个字段显式设置为 null ,则将数据库的值更新为 null ,用指针的话好像也没办法区分 nil 和 null ,有什么好办法能解决这个问题吗?
1
sthwrong 7 小时 44 分钟前
给定一个不会传的默认值就行了。
|
![]() |
2
Charlie17Li 7 小时 42 分钟前
1. grom 的默认行为不就是:字段如果是默认值就不会去更新吗?
2. 建议贴一下你的 model 结构体,难不成基础类型你也使用指针?类似(*bool, *string)? |
![]() |
3
ultimate42 OP @Charlie17Li 我用的是 sqlc ,有些基础类型确实用的是指针,因为我还要传零值和""进来
|
4
niubilewodev 6 小时 25 分钟前
你是期望区分这三种情况: 不修改,有值,NULL
只用类型来区分,应该做不到。 倒是 Map 装一切可以用 contain key 来区分是不修改还是置为 NULL |
![]() |
5
ultimate42 OP |
6
vultr 6 小时 0 分钟前
我是在 patch 方法里多传个 attrsName ...string ,如果你确定要改,不是有效值的都是 nil 了。
|
![]() |
7
everhythm 4 小时 40 分钟前
看你用的 db 库支持哪种,另起新的类型
比如 pgx 支持 pgtype.Text 显示设置存入为 null |
![]() |
8
loading 4 小时 37 分钟前 via Android
零值问题,我感觉 go 这方面是挺难受的。
我上一次就是硬着头写了个函数,里面直接拼接跑的 SQL 语句。因为那是工作上的屎山。 如果自己的业余项目,我没想到优雅的方法。 |
![]() |
9
ultimate42 OP @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'); |