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,请多多指教
