gorm 結構
type Thgl struct {
Model
Code string `gorm:"size(10);index:pre_idx" json:"code"`
Next MyJson `json:"next"` //子Bom
Files MyJson `json:"files"` //文件
Glass MyJson `json:"glass"` //玻璃參數 ->價格
}
//增加圖號
func AddThgl(data map[string]interface{}, name string) (int, error) {
str := Thgl{
Code: data["code"].(string),
Next: MyJson{data["next"]},
Files: MyJson{data["files"]},
Glass: MyJson{data["glass"]},
}
err := db.Create(&str).Error
return str.ID, err
}
//更改圖號
func EditThgl(data map[string]interface{}) error {
data["next"] = MyJson{data["next"]}
data["files"] = MyJson{data["files"]}
data["glass"] = MyJson{data["glass"]}
err := db.Model(&Thgl{}).Updates(data).Error
return err
}
創建自定義類型
type MyJson struct {
v interface{}
}
// 寫入數據庫之前,對數據做類型轉換
func (s MyJson) Value() (driver.Value, error) {
b, err := json.Marshal(s.v)
return string(b), err
}
// 將數據庫中取出的數據,賦值給目標類型
func (s *MyJson) Scan(v interface{}) error {
var err error
var data_ map[string]interface{}
var data []map[string]interface{}
fmt.Println(v, string(v.([]byte)))
switch vt := v.(type) {
case string:
err = json.Unmarshal([]byte(vt), &s.v)
case []byte:
if vt[0] == 91 {
err = json.Unmarshal(vt, &data)
*s = MyJson{data}
//s.v = data
} else {
err = json.Unmarshal(vt, &data_)
//s.v = data_
*s = MyJson{data_}
}
default:
return errors.New("myjson 轉換錯誤")
}
return err
}
// 自定義類型上實現 Marshaler 的接口, 在進行 Marshal 時就會使用此除的實現來進行 json 編碼
func (s MyJson) MarshalJSON() ([]byte, error) {
// 可以自由調整精度
//if float64(f) == float64(int(f)) {
// return []byte(strconv.FormatFloat(float64(f), 'f', 2, 64)), nil
//}
//return []byte(strconv.FormatFloat(float64(f), 'f', -1, 64)), nil*/
b, err := json.Marshal(s.v)
fmt.Println(b, string(b))
return b, err
}
/*
func (t *MyJson) UnmarshalJSON(b []byte) error {
b = bytes.Trim(b, "\"")
ext, err := time.Parse(t.UnmarshalTimeFormat(), string(b))
if err != nil {
// do something
}
*t = ExTime{ext}
return nil
}
*/
初學go,請多多指教
