V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ultimate42
V2EX  ›  Go 编程语言

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

  •  
  •   ultimate42 · 8 小时 18 分钟前 · 354 次点击

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

    sthwrong
        1
    sthwrong  
       7 小时 44 分钟前
    给定一个不会传的默认值就行了。
    Charlie17Li
        2
    Charlie17Li  
       7 小时 42 分钟前
    1. grom 的默认行为不就是:字段如果是默认值就不会去更新吗?
    2. 建议贴一下你的 model 结构体,难不成基础类型你也使用指针?类似(*bool, *string)?
    ultimate42
        3
    ultimate42  
    OP
       7 小时 39 分钟前
    @Charlie17Li 我用的是 sqlc ,有些基础类型确实用的是指针,因为我还要传零值和""进来
    niubilewodev
        4
    niubilewodev  
       6 小时 25 分钟前
    你是期望区分这三种情况: 不修改,有值,NULL
    只用类型来区分,应该做不到。
    倒是 Map 装一切可以用 contain key 来区分是不修改还是置为 NULL
    ultimate42
        5
    ultimate42  
    OP
       6 小时 9 分钟前
    vultr
        6
    vultr  
       6 小时 0 分钟前
    我是在 patch 方法里多传个 attrsName ...string ,如果你确定要改,不是有效值的都是 nil 了。
    everhythm
        7
    everhythm  
       4 小时 40 分钟前
    看你用的 db 库支持哪种,另起新的类型

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

    如果自己的业余项目,我没想到优雅的方法。
    ultimate42
        9
    ultimate42  
    OP
       4 小时 11 分钟前
    @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');
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:59 · PVG 21:59 · LAX 06:59 · JFK 09:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.