Go语言结合gorm实现读取PostgreSQL的json数据类型

作者:

文章目录
  • 在本例中,数据库有一个表 test_tbl1,包含如下三个字段: id,主键,长整型 params,jsonb类型 params2,json类型 接下来展示从该表中读取一行数据的几种方法:
  • 目录
    • 常用方法
      • 方法一
      • 方法二
      • 方法三

    在本例中,数据库有一个表 test_tbl1,包含如下三个字段:

    • id,主键,长整型
    • params,jsonb类型
    • params2,json类型

    接下来展示从该表中读取一行数据的几种方法:

    type TestTbl1 struct {
       ID      int64 `gorm:"primaryKey"`
       Params  string
       Params2 string
    }
    
    func main() {
        row := &TestTbl1{}
        var db *gorm.DB
        db = initDB()   // 初始化数据库连接的代码省略,可以查阅相关资料
        err := db.First(row).Error
        if err != nil {
           log.Error("fail to query test_tbl1: %v", err)
        }
        log.Infof("get data: %+v", row)
        log.Infof("get data: params: %+v", row.Params)
        log.Infof("get data: params2: %+v", row.Params2)
    }
    

    这是比较简单和适用性较强的方法,查出字符串之后再做解析。即使数据库的json/jonb字段格式不一致时,也能正常运行。

    考虑到go中做json解析的方法是json.Unmarshal,该方法的参数是[]byte,为了方便做json解析,可以直接将字段类型从sting改为[]byte:

    type TestTbl1 struct {
       ID      int64 `gorm:"primaryKey"`
       Params  []byte
       Params2 []byte
    }
    
    func main() {
        row := &TestTbl1{}
        var db *gorm.DB
        db = initDB()   // 初始化数据库连接的代码省略,可以查阅相关资料
        err := db.First(row).Error
        if err != nil {
           log.Error("fail to query test_tbl1: %v", err)
        }
        log.Infof("get data: %+v", row)
        log.Infof("get data: params: %+v", string(row.Params))
        log.Infof("get data: params2: %+v", string(row.Params2))
    }
    

    如果json/jsonb字段的格式是固定的,可以在查询的时候自动做json解析。在本例中,假设param的取值示例为 {"k1": "v1", "k2": "v2"},param2的取值示例为["v1","v2","v3"],则相关代码如下:

    type StringArray []string
    
    func (j *StringArray) Scan(value interface{}) error {
       return json.Unmarshal(value.([]byte), j)
    }
    
    func (j *StringArray) Value() (driver.Value, error) {
       return json.Marshal(j)
    }
    
    type JsonObject struct {
       K1 string
       K2 string
    }
    
    func (j *JsonObject) Scan(value interface{}) error {
       return json.Unmarshal(value.([]byte), j)
    }
    
    func (j *JsonObject) Value() (driver.Value, error) {
       return json.Marshal(j)
    }
    
    type TestTbl1 struct {
       ID      int64     `gorm:"primaryKey"`
       Params  JsonObject     `gorm:"type:jsonb"`
       Params2 StringArray `gorm:"type:json"`
    }
    
    func main() {
        row := &TestTbl1{}
        var db *gorm.DB
        db = initDB()   // 初始化数据库连接的代码省略,可以查阅相关资料
        err := db.First(row).Error
        if err != nil {
           log.Error("fail to query test_tbl1: %v", err)
        }
        log.Infof("get data: %+v", row)
        log.Infof("get data: params: %+v", row.Params)
        log.Infof("get data: params2: %+v", row.Params2)
    }
    

    这一种方法的普适性有限。例如,如果json/jsonb字段存储的是第三方透传参数,则其格式就不是固定的,本方法则不适用。

    到此这篇关于Go语言结合gorm实现读取PostgreSQL的json数据类型的文章就介绍到这了,更多相关Go gorm读取PostgreSQL数据内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • 使用GORM将PostgreSQL集成到Go框架中
    • Golang连接PostgreSQL基本操作的实现
    • go 如何修改postgresql的配置参数
    • Golang连接并操作PostgreSQL数据库基本操作
    • 使用Go和Gorm实现读取SQLCipher加密数据库

    站内搜索