1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
首先是簡短的回答: sql 包中有一些類型,例如sql.NullString(用于表中的可為空字符串,并猜測Nullint64和NullBool和...用法:)),您應(yīng)該在結(jié)構(gòu)中使用它們。
長一個(gè):有兩種接口在走這個(gè)可用,首先是掃描儀,另一個(gè)是估值師對數(shù)據(jù)庫的任何特殊類型,(例如,我用這主要與JSONB Postgres里),你需要?jiǎng)?chuàng)建一個(gè)類型,在該類型上實(shí)現(xiàn)這兩個(gè)(或其中一個(gè))接口。
調(diào)用Scan函數(shù)時(shí)會使用掃描儀。來自數(shù)據(jù)庫驅(qū)動程序的數(shù)據(jù),通常[]byte是輸入,您負(fù)責(zé)處理它。另一個(gè),當(dāng)該值用作查詢中的輸入時(shí)使用。如果您只需要讀取數(shù)據(jù),則結(jié)果“通常”是一個(gè)字節(jié)(和一個(gè)錯(cuò)誤),Scanner 就足夠了,反之亦然,如果您需要在查詢中寫入?yún)?shù) Valuer 就足夠了
對于實(shí)現(xiàn)示例,我建議查看sql包中的類型。
還有一個(gè)在 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)
}
驅(qū)動值通常是[]byte但string并且nil是可以接受的。所以這也可以處理可為空的字段。
- 1 回答
- 0 關(guān)注
- 646 瀏覽
添加回答
舉報(bào)