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

相关文章

  • go select编译期的优化处理逻辑使用场景分析

    go select编译期的优化处理逻辑使用场景分析

    select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。接下来通过本文给大家介绍go select编译期的优化处理逻辑使用场景分析,感兴趣的朋友一起看看吧
    2021-06-06
  • Go语言kafka生产消费消息实例搬砖

    Go语言kafka生产消费消息实例搬砖

    这篇文章主要为大家介绍了Go语言kafka生产消费消息的实例搬砖,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go Gin框架中的路由组及其优先级探索分析

    Go Gin框架中的路由组及其优先级探索分析

    在构建Web应用程序时,理解和有效地使用路由是至关重要的,Go语言的Gin框架为此提供了强大的工具,特别是通过其路由组功能,本文将深入探讨Gin的RouterGroup,特别是在路径匹配和优先级方面的行为
    2024-01-01
  • Go语言并发模型的2种编程方案

    Go语言并发模型的2种编程方案

    这篇文章主要介绍了Go语言并发模型的2种编程方案,本文给出共享内存和通过通信的2种解决方案,并给出了实现代码,需要的朋友可以参考下
    2014-10-10
  • Go语言实现ssh&scp的方法详解

    Go语言实现ssh&scp的方法详解

    这篇文章主要为大家详细介绍了如何利用Go语言实现ssh&scp,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2022-10-10
  • golang 如何替换掉字符串里面的换行符\n

    golang 如何替换掉字符串里面的换行符\n

    这篇文章主要介绍了golang 替换掉字符串里面的换行符\n操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Go Module依赖管理的实现

    Go Module依赖管理的实现

    Go Module是Go语言的官方依赖管理解决方案,其提供了一种简单、可靠的方式来管理项目的依赖关系,本文主要介绍了Go Module依赖管理的实现,感兴趣的可以了解一下
    2024-06-06
  • 一文搞懂Go语言中条件语句的使用

    一文搞懂Go语言中条件语句的使用

    这篇文章主要介绍了Go语言中五个常用条件语句的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 利用golang和shell计算一个字符串的md5值

    利用golang和shell计算一个字符串的md5值

    这篇文章主要介绍了如何利用golang和shell计算一个字符串的md5值,我们先用shell来计算一下,再去判断golang计算的md5值是否正确,文中有详细的图文介绍,需要的朋友可以参考下
    2024-03-03
  • 一文带你熟悉Go语言中函数的使用

    一文带你熟悉Go语言中函数的使用

    这篇文章主要和大家分享一下Go语言中的函数的使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的小伙伴可以参考一下
    2022-11-11

最新评论