亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號