摘自: http://www.itrensheng.com/archives/golang_gorm_implement golang 使用 redis \ kafka \ gorm 值得一看
mysql在5.7版本中已经开始支持json数据类型,但是目前gorm还不支持json类型,如下建表语句,定义query_param为json类型,
CREATE TABLE `report` (
`id` bigint(20) NOT NULL,
`query_param` json NOT NULL,
`create_by` varchar(50) DEFAULT NULL COMMENT '创建人',
`create_date` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(50) DEFAULT NULL COMMENT '修改人',
`update_date` timestamp NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
解决办法是自定义一个JSON 的type
package models
import (
"bytes"
"errors"
"database/sql/driver"
)
type JSON []byte
func (j JSON) Value() (driver.Value, error) {
if j.IsNull() {
return nil, nil
}
return string(j), nil
}
func (j *JSON) Scan(value interface{}) error {
if value == nil {
*j = nil
return nil
}
s, ok := value.([]byte)
if !ok {
errors.New("Invalid Scan Source")
}
*j = append((*j)[0:0], s...)
return nil
}
func (m JSON) MarshalJSON() ([]byte, error) {
if m == nil {
return []byte("null"), nil
}
return m, nil
}
func (m *JSON) UnmarshalJSON(data []byte) error {
if m == nil {
return errors.New("null point exception")
}
*m = append((*m)[0:0], data...)
return nil
}
func (j JSON) IsNull() bool {
return len(j) == 0 || string(j) == "null"
}
func (j JSON) Equals(j1 JSON) bool {
return bytes.Equal([]byte(j), []byte(j1))
}
用法是在定义model的时候定义为:“QueryParam JSON”
type Report struct {
ID int64 `json:"id"`
QueryParam JSON `json:"queryParam"`
CreateBy string `json:"createBy"`
CreateDate time.Time `json:"createDate"`
UpdateBy string `json:"updateBy"`
UpdateDate time.Time `json:"updateDate"`
}