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

试图解决我在构建 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.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,而不是我得到的“”值,谢谢


偶然的你
浏览 72回答 1
1回答

白猪掌柜的

如果您想将空字符串视为空值,您至少有两个选择。“延长” 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是struct。内置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)}
打开App,查看更多内容
随时随地看视频慕课网APP