MySQL
到现如今已经是原生支持Json
类型(5.7.8版本之后),毕竟JSON存储一直都是NoSql玩的溜,触不及防,MySQL里头也能支持了,且能对JSON数据进行相对的操作。
NoSql中,对JSON数据天生友好,都算是不固定(弱结构)的数据存储。而MySQL中,字段都是先天所定(强结构),后续更改会相对别扭一些(相对于NoSql型数据库)。
Go语言中,我们一般使用Gorm和原生SQL对数据库进行操作,虽然中大型项目中,大多前辈以及一些DBA都会推荐使用原生SQL,这样的好处是防止中间层出现意外
的错误,以及排查问题方便性。特别的,如果遇到性能问题,使用orm
会造成排查问题的一些复杂性。
当然,我要是为了开发的便利和速度,一般都会选择Gorm
。
由于Gorm原生并不支持JSON数据结构,需要添加一些方法才能正常操作JSON字段。
JSON字段的支持
在Gorm
需要加入两个函数:Value
、Scan
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| type Demo struct { id string obj DemoObj `sql:"TYPE:json"` }
struct DemoObj struct { c1 string c2 int c3 bool }
func (c DemoObj) Value() (driver.Value, error) { b, err := json.Marshal(c) return string(b), err }
func (c *DemoObj) Scan(input interface{}) error { return json.Unmarshal(input.([]byte), c) }
|
以下是对数组的支持。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| /****************使gorm支持[]string结构*******************/ type Strings []string
func (c *Strings) Value() (driver.Value, error) { b, err := json.Marshal(c) return string(b), err }
func (c *Strings) Scan(input interface{}) error { return json.Unmarshal(input.([]byte), c) }
/****************使gorm支持[]string结构*******************/
/****************使gorm支持[]int64结构*******************/ type Int64s []int64
func (c Int64s) Value() (driver.Value, error) { b, err := json.Marshal(c) return string(b), err }
func (c *Int64s) Scan(input interface{}) error { return json.Unmarshal(input.([]byte), c) }
/****************使gorm支持[]int64结构*******************/
|
注意
Scan 方法的实例需要是指针类型,不然会select不到数据