gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:30:00 25 4
gpt4 key购买 nike

尝试解决我在构建 api 时遇到的这个问题。

数据库:

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.v3

type 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,而不是我得到的“”值谢谢

最佳答案

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

“扩展”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.Time 的类型是一个结构。内置len函数适用于 slice 、数组、数组指针、映射、 channel 和字符串。不是结构体。因此,在这种情况下,您可以检查 data 参数(这是一个字节 slice ),方法是将其转换为字符串并将其与包含空字符串的字符串进行比较,即它有两个双引号,没有其他内容。

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)
}

关于sql - golang null.String 解码无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57669174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com