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是可以接受的。所以這也可以處理可為空的字段。
- 1 回答
- 0 關注
- 658 瀏覽
添加回答
舉報