gorm 自定义数据类型 Create时转为 json字符串

浏览:892次阅读
没有评论

前言

gorm 表字段 使用自定义数据类型转换到json
在官网文档也有 本帖记录一下

官网写法

type JSON json.RawMessage

// 实现 sql.Scanner 接口,Scan 将 value 扫描至 Jsonb
func (j *JSON) Scan(value interface{}) error {bytes, ok := value.([]byte)
  if !ok {return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
  }

  result := json.RawMessage{}
  err := json.Unmarshal(bytes, &result)
  *j = JSON(result)
  return err
}

// 实现 driver.Valuer 接口,Value 返回 json value
func (j JSON) Value() (driver.Value, error) {if len(j) == 0 {return nil, nil}
  return json.RawMessage(j).MarshalJSON()}

自己写法 1

写法跟官网东西都一样

type Cdkey struct{addMail AddMail // 后面格式省略}

type AddMail struct{
    Id int 
    Name int
    // 其他字段省略
}

// 读取值时返回 json 字符串
func (m AddMail) Value() (driver.Value, error) {b, err := json.Marshal(m)
    return string(b), err
}

// 扫描时转换为自定义数据类型
func (m *AddMail) Scan(v interface{}) error {
    //>> text 转 json
    return json.Unmarshal(v.([]byte), &m)
}
注意第二种情况

type Cdkey struct{addMail []AddMail // 后面格式省略
}

type AddMail struct{
    Id int 
    Name int
    // 其他字段省略
}

// 当为数组情况时按照上一个步骤的方法是调用不到 scan 的
// 需要将[]AddMail 重新声明一个类型

type AddMailList []AddMail

// 修改 Cdkey
type Cdkey struct{addMail AddMailList // 后面格式省略}

//scan 方法修改为
func (m *AddMailList) Scan(v interface{}) error {return json.Unmarshal(v.([]byte), &m)
}

感谢神秘赖总的帮助

调用 cdkey.Create 时会调用 Value 获取数据值

另外一个方法

func (m AddMail) GormValue(ctx context.Context, db *gorm.DB) clause.Expr {b, _ := json.Marshal(m)
    return clause.Expr{SQL:"'"+string(b)+"'",// 注意此处他是原样返回的 需要自己加引号
    }
}
正文完
 0
包子
版权声明:本站原创文章,由 包子 2021-09-29发表,共计1263字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)