为了账号安全,请及时绑定邮箱和手机立即绑定

golang null.String 解码无法正常工作

golang null.String 解码无法正常工作

Go
偶然的你 2023-07-17 14:58:18
试图解决我在构建 api 时遇到的这个问题。D b:DROP TABLE IF EXISTS contacts CASCADE;CREATE TABLE IF NOT EXISTS contacts (        uuid UUID UNIQUE PRIMARY KEY,        first_name varchar(150),);DROP TABLE IF EXISTS workorders CASCADE;CREATE TABLE IF NOT EXISTS workorders (        uuid UUID UNIQUE PRIMARY KEY,        work_date timestamp WITH time zone,        requested_by UUID REFERENCES contacts (uuid) ON UPDATE CASCADE ON DELETE CASCADE,);结构:https://gopkg.in/guregu/null.v3type WorkorderNew struct {    UUID               string      `json:"uuid"`    WorkDate           null.Time   `json:"work_date"`    RequestedBy        null.String `json:"requested_by"`}API代码:workorder := &models.WorkorderNew{}if err := json.NewDecoder(r.Body).Decode(workorder); err != nil {    log.Println("decoding fail", err)}// fmt.Println(NewUUID())u2, err := uuid.NewV4()if err != nil {    log.Fatalf("failed to generate UUID: %v", err)}q := `            INSERT            INTO workorders                (uuid,                work_date,                requested_by                )            VALUES                ($1,$2,$3)            RETURNING uuid;`statement, err := global.DB.Prepare(q)global.CheckDbErr(err)fmt.Println("requested by", workorder.RequestedBy)lastInsertID := ""err = statement.QueryRow(    u2,    workorder.WorkDate,    workorder.RequestedBy,).Scan(&lastInsertID)global.CheckDbErr(err)json.NewEncoder(w).Encode(lastInsertID)当我发送一个以 null 作为值的 API 请求时,它会按预期工作,但是当我尝试发送一个“”作为 null.String 或 null.Time 的值时,它会失败作品:{     "work_date":"2016-12-16T19:00:00Z",   "requested_by":null}不工作:{     "work_date":"2016-12-16T19:00:00Z",   "requested_by":""}基本上,当我调用 QueryRow 并将其保存到数据库时,workorder.RequestedBy 值应该为 null,而不是我得到的“”值,谢谢
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

如果您想将空字符串视为空值,您至少有两个选择。


“延长” null.String:


type MyNullString struct {

    null.String

}


func (ns *MyNullString) UnmarshalJSON(data []byte) error {

    if string(data) == `""` {

        ns.Valid = false

        return nil

    }

    ns.String.UnmarshalJSON(data)

}

NULLIF或者在查询中使用:


INSERT INTO workorders (

    uuid

    , work_date

    , requested_by

) VALUES (

    $1

    , $2

    , NULLIF($3, '')

)

RETURNING uuid

更新

要扩展 ,null.Time您必须了解 的类型null.Time.Timestruct。内置len函数适用于切片、数组、数组指针、映射、通道和字符串。不是结构体。因此,在这种情况下,您可以检查参数(这是一个字节切片),方法是将其转换为字符串并将其与包含空字符串的data字符串进行比较,即它有两个双引号而没有其他内容。

type MyNullTime struct {

    null.Time

}


func (ns *MyNullTime) UnmarshalJSON(data []byte) error {

    if string(data) == `""` {

        ns.Valid = false

        return nil

    }

    return ns.Time.UnmarshalJSON(data)

}


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 65 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信