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

 更新时间:2025年10月29日 09:14:18   作者:qinyuan15  
使用gorm读取PostgreSQL中json/jsonb类型数据是一个常见的操作,本文介绍几种方法,适用于几类不同的场景,感兴趣的小伙伴可以跟随小编一起学习一下

常用方法

在本例中,数据库有一个表 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数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang实现京东支付v2版本的示例代码

    golang实现京东支付v2版本的示例代码

    这篇文章主要介绍了golang实现京东支付v2版本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • GO的基础知识扫盲注意事项

    GO的基础知识扫盲注意事项

    这篇文章主要介绍了GO的基础知识注意事项,本文是GO语言小白的扫盲文,主要讲解了go语言的基本知识,GO程序目录结构,GO程序包的导入与别名运用,GO内置关键字,GO注释方法需要的朋友可以参考下
    2022-12-12
  • 详解如何使用Golang实现自定义规则引擎

    详解如何使用Golang实现自定义规则引擎

    规则引擎的功能可以简化为当满足一些条件时触发一些操作,通常使用 DSL 自定义语法来表述,本文给大家介绍了如何使用Golang实现自定义规则引擎,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-05-05
  • Golang两行代码实现发送钉钉机器人消息

    Golang两行代码实现发送钉钉机器人消息

    创建一个钉钉机器人必须使用加签,本文通过Golang两行代码实现发送钉钉机器人消息,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • Golang的os标准库中常用函数的整理介绍

    Golang的os标准库中常用函数的整理介绍

    这篇文章主要介绍了Go语言的os标准库中常用函数,主要用来实现与操作系统的交互功能,需要的朋友可以参考下
    2015-10-10
  • golang使用redis实现全文搜索功能详解

    golang使用redis实现全文搜索功能详解

    这篇文章主要为大家详细介绍了golang如何使用redis实现全文搜索功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • Go项目中添加生成时间与版本信息的方法

    Go项目中添加生成时间与版本信息的方法

    本文主要介绍了Go项目中添加生成时间与版本信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • golang如何设置Header Content-type

    golang如何设置Header Content-type

    这篇文章主要介绍了golang如何设置Header Content-type问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • goland中文件头自动注释的操作

    goland中文件头自动注释的操作

    这篇文章主要介绍了goland中文件头自动注释的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 关于go-zero服务自动收集问题分析

    关于go-zero服务自动收集问题分析

    这篇文章主要介绍了关于go-zero服务自动收集问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12

最新评论