写了个 patch 方法,因此我希望如果没有传入这个字段,则不更新这个字段的值,如果将这个字段显式设置为 null ,则将数据库的值更新为 null ,用指针的话好像也没办法区分 nil 和 null ,有什么好办法能解决这个问题吗?
1 sthwrong 39 天前 给定一个不会传的默认值就行了。 |
![]() | 2 Charlie17Li 39 天前 1. grom 的默认行为不就是:字段如果是默认值就不会去更新吗? 2. 建议贴一下你的 model 结构体,难不成基础类型你也使用指针?类似(*bool, *string)? |
![]() | 3 ultimate42 OP @Charlie17Li 我用的是 sqlc ,有些基础类型确实用的是指针,因为我还要传零值和""进来 |
4 niubilewodev 39 天前 你是期望区分这三种情况: 不修改,有值,NULL 只用类型来区分,应该做不到。 倒是 Map 装一切可以用 contain key 来区分是不修改还是置为 NULL |
![]() | 5 ultimate42 OP |
6 vultr 39 天前 我是在 patch 方法里多传个 attrsName ...string ,如果你确定要改,不是有效值的都是 nil 了。 |
![]() | 7 everhythm 39 天前 看你用的 db 库支持哪种,另起新的类型 比如 pgx 支持 pgtype.Text 显示设置存入为 null |
![]() | 8 loading 39 天前 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'); |
![]() | 10 ultimate42 OP 参考这篇文章勉强实现了 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 } } 真是挺蛋疼的... |
11 sthwrong 39 天前 我记得 database/sql 有 sql.Null 类型的,直接用就行了 |
12 jc89898 24 天前 用 pointer type 啊 |
13 layxy 18 天前 这个很蛋疼,一度想放弃使用 go 开发,像 java 或者 nodejs 其实处理这种很简单 |