go-gorm使用json字段

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需要加入两个函数:ValueScan

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不到数据