第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在 Go 中繞過 sql 空值問題

在 Go 中繞過 sql 空值問題

Go
慕尼黑8549860 2021-11-01 17:07:59
我想使用 Go 為廣泛使用空值的現(xiàn)有數(shù)據(jù)庫創(chuàng)建 API。Go 不會將 null 掃描為空字符串(或等效項),因此我需要實現(xiàn)一種解決方法。我發(fā)現(xiàn)的解決方法讓我不滿意。事實上,因為這個問題,我去尋找一種動態(tài)語言,但 Go 有一些吸引力,如果可能的話,我想堅持下去。以下是不滿足的解決方法:不要在數(shù)據(jù)庫中使用空值。不合適,因為數(shù)據(jù)庫是預(yù)先存在的,我無權(quán)干涉它的結(jié)構(gòu)。數(shù)據(jù)庫比我的應(yīng)用程序更重要,而不是相反。在 sql 查詢中,在數(shù)據(jù)到達我的應(yīng)用程序之前,使用 COALESCE、ISNULL 等將空值轉(zhuǎn)換為空字符串(或等效值)。不適合,因為有很多字段和很多表。除了幾個明顯的(主鍵、姓氏)之外,我不確定可以依賴哪些字段不給我一個空值,所以我會防御性地將我的 sql 查詢到處亂七八糟。使用sql.NullString、 sql.NullInt64 、 sql.NullFloat64 等將空值轉(zhuǎn)換為空字符串(或等效值)作為中間步驟,然后再將它們設(shè)置為目標(biāo)類型。這遇到了與上述相同的問題,只是我把 Go 代碼弄得亂七八糟,而不是我的 sql 查詢。使用 *pointers 和 []byte 的組合,將每個項目掃描到內(nèi)存位置,而不將其提交給特定類型(除了 []byte),然后以某種方式處理原始數(shù)據(jù)。但是要對數(shù)據(jù)做一些有意義的事情,你必須把它轉(zhuǎn)換成更有用的東西,然后你回到 sql.Nullstring 或者如果 x==nil{handle it},這又是在逐案基礎(chǔ)上發(fā)生的我需要處理的任何領(lǐng)域。所以,再一次,我們正在查看混亂、凌亂、容易出錯的代碼,我一直在重復(fù)自己,而不是在我的編碼中枯燥乏味。向 Go ORM 庫尋求幫助。好吧,我做到了,但令我驚訝的是,他們都沒有解決這個問題。制作我自己的輔助包,將所有空字符串轉(zhuǎn)換為"",空整數(shù)轉(zhuǎn)換為0,空浮點數(shù)轉(zhuǎn)換為0.00,空布爾值轉(zhuǎn)換為false等,并使其成為從sql驅(qū)動程序掃描進來的過程的一部分,從而導(dǎo)致常規(guī),普通字符串、整數(shù)、浮點數(shù)和布爾值。不幸的是,如果 6 是解決方案,我沒有專業(yè)知識。我懷疑該解決方案將涉及諸如“如果要掃描到的項目的預(yù)期類型是字符串,則將其設(shè)為 sql.NullString 并從中提取一個空字符串。但是如果要掃描到的項目是一個 int,使它成為 NullInt64 并從中得到一個零。但是如果......(等)“有什么我錯過了嗎?謝謝你。
查看完整描述

1 回答

?
眼眸繁星

TA貢獻1873條經(jīng)驗 獲得超9個贊

使用 sql 掃描目標(biāo)變量的指針可以掃描數(shù)據(jù),使用(取決于檢查是否 != nil)并編組到 json,從 API 發(fā)送出去,而不必放入數(shù)百個 sql .Nullstring、sql.Nullfloat64 等無處不在??罩当黄孥E般地保存下來并通過編組的 json 發(fā)送出去。(見底部的父名)。在另一端,客戶端可以使用 javascript 中的空值,這樣可以更好地處理它們。


func queryToJson(db *sql.DB) []byte {

    rows, err := db.Query(

      "select mothername, fathername, surname from fams" +

      "where surname = ?", "Nullfather"

    )

    defer rows.Close()


    type record struct {

        Mname, Fname, Surname *string  // the key: use pointers

    }

    records := []record{}


    for rows.Next() {

        var r record

        err := rows.Scan(r.Mname, r.Fname, r.Surname) // no need for "&"

        if err != nil {

            log.Fatal(err)

        }

        fmt.Println(r)

        records = append(records, r)

    }

    j, err := json.Marshal(records)

    if err != nil {

        log.Fatal(err)

    }

    return j

}

j := queryToJson(db)

fmt.Println(string(j)) // [{"Mothername":"Mary", "Fathername":null, "Surname":"Nullfather"}]



查看完整回答
反對 回復(fù) 2021-11-01
  • 1 回答
  • 0 關(guān)注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號