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

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

無法將 <nil> 轉換為類型 ...?

無法將 <nil> 轉換為類型 ...?

Go
藍山帝景 2022-01-04 18:49:01
我嘗試使用 database/sql 將數據庫行查詢為 Go 類型,我的代碼片段如下:type User struct {    user_id     int64    user_name   string    user_mobile string    password    string    email       interface{}    nickname    string    level       byte    locked      bool    create_time string    comment     string  // convert <nil> to *string error }func TestQueryUser(t *testing.T) {    db := QueryUser(driverName, dataSourceName)    stmtResults, err := db.Prepare(queryAll)    defer stmtResults.Close()    var r *User = new(User)    arr := []interface{}{        &r.user_id, &r.user_name, &r.user_mobile, &r.password, &r.email,        &r.nickname, &r.level, &r.locked, &r.create_time, &r.comment,    }    err = stmtResults.QueryRow(username).Scan(arr...)    if err != nil {        t.Error(err.Error())    }    fmt.Println(r.email)}MySQL:如您所見,某些字段具有NULL值,因此我必須將interface{}類型設置為 Go 的 User 結構,然后將其轉換NULL為nil.--- FAIL: TestQueryUser (0.00s)        user_test.go:48: sql: Scan error on column index 9: unsupported Scan, storing driver.Value type <nil> into type *string有人有更好的方法嗎? 或者我必須更改 MySQL 字段并設置其 DEFAULT ' '
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

首先是簡短的回答: sql 包中有一些類型,例如sql.NullString(用于表中的可為空字符串,并猜測Nullint64和NullBool和...用法:)),您應該在結構中使用它們。


長一個:有兩種接口在走這個可用,首先是掃描儀,另一個是估值師對數據庫的任何特殊類型,(例如,我用這主要與JSONB Postgres里),你需要創建一個類型,在該類型上實現這兩個(或其中一個)接口。


調用Scan函數時會使用掃描儀。來自數據庫驅動程序的數據,通常[]byte是輸入,您負責處理它。另一個,當該值用作查詢中的輸入時使用。如果您只需要讀取數據,則結果“通常”是一個字節(和一個錯誤),Scanner 就足夠了,反之亦然,如果您需要在查詢中寫入參數 Valuer 就足夠了


對于實現示例,我建議查看sql包中的類型。


還有一個在 postgresql 中與 JSONB/JSON 類型一起使用的類型示例


// GenericJSONField is used to handle generic json data in postgres

type GenericJSONField map[string]interface{}



// Scan convert the json field into our type

func (v *GenericJSONField) Scan(src interface{}) error {

    var b []byte

    switch src.(type) {

    case []byte:

        b = src.([]byte)

    case string:

        b = []byte(src.(string))

    case nil:

        b = make([]byte, 0)

    default:

        return errors.New("unsupported type")

    }


    return json.Unmarshal(b, v)

}


// Value try to get the string slice representation in database

func (v GenericJSONField) Value() (driver.Value, error) {

    return json.Marshal(v)

}

驅動值通常是[]byte但string并且nil是可以接受的。所以這也可以處理可為空的字段。


查看完整回答
反對 回復 2022-01-04
  • 1 回答
  • 0 關注
  • 658 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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