GORM使用PostgreSQL数据库json类型的一次挖坑经历

因为项目数据库使用很简单,没有复杂的查询,因此使用GORM来操作PostgreSQL 10。 最初表结构的定义是这样的:

type LogData struct {
  ID uint `gorm:"primary_key; not null"`
  Data json.RawMessage
}

此处使用的 json.RawMessage 属于标准 encoding/json ,因为还项目后来需要用到了json-iter流式解析。因为 github.com/json-iterator/go 兼容 encoding/json 的API,因此本人毫不犹豫的将项目中的 encoding/json 都替换为了 github.com/json-iterator/go 。幸运的是第二天QA就测试就发现了由此导致的问题。GORM在生成SQL语句时,对着两个包的处理区别:

encoding/json: jsonb

github.com/json-iterator/go: bytea

对于选定PostgreSQL数据库的情况,这里的准确做法应该是将LogData.Data定义为 postgres.Jsonb类型,明确告知GORM生成的SQL语句数据类型。