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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Go 中繞過 sql 空值問題

在 Go 中繞過 sql 空值問題

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

1 回答

?
眼眸繁星

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊

使用 sql 掃描目標(biāo)變量的指針可以掃描數(shù)據(jù),使用(取決于檢查是否 != nil)并編組到 json,從 API 發(fā)送出去,而不必放入數(shù)百個(gè) sql .Nullstring、sql.Nullfloat64 等無(wú)處不在??罩当黄孥E般地保存下來(lái)并通過編組的 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"}]



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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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