为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 从 postgres 获取原始 json

Golang 从 postgres 获取原始 json

Go
红糖糍粑 2022-05-10 14:04:47
我在我的 postgres 数据库中存储了过程SELECT *FROM get_products()返回json[  {    "id": 1,    "name": "one",    "addition": "spec1",    "size": "",    "category_id": 1,    "vendor_id": 1  },  {    "id": 2,    "name": "two",    "addition": "spec2",    "size": "",    "category_id": 1,    "vendor_id": 1  },/// ...]如何在不创建结构的情况下从过程中返回结果,因为 json 中可能存在未知数量的字段?我有这个代码。当过程返回表而不是json时,它运行良好func (s ProductController) GetAll(c *gin.Context) {    db, err := sql.Open("postgres", "host=localhost dbname=postgres sslmode=disable user=postgres")    rows, err := db.Query("SELECT *FROM get_products()")    if err != nil {        panic(err)    }    cols, err := rows.Columns()    if err != nil {        panic(err)    }    allgeneric := make([]map[string]interface{}, 0)    colvals := make([]interface{}, len(cols))    for rows.Next() {        colassoc := make(map[string]interface{}, len(cols))        for i, _ := range colvals {            colvals[i] = new(interface{})        }        if err := rows.Scan(colvals...); err != nil {            panic(err)        }        for i, col := range cols {            colassoc[col] = *colvals[i].(*interface{})        }        allgeneric = append(allgeneric, colassoc)    }    err2 := rows.Close()    if err2 !=nil {        panic(err2)    }    fmt.Println(allgeneric)    c.JSON(200, allgeneric)}它返回这样的东西[    {        "get_products": "W3siaWQiOjEsIm5hbWUiOiJHMTciLCJhZGRpdGlvbiI6IiIsInNpemUiOiJTdGFuZGFyZCIsImNhdGVnb3J5X2lkIjoxLCJ2ZW5kb3JfaWQiOjF9LCB7ImlkIjoyLCJuYW1lIjoiRzE3IiwiYWRkaXRpb24iOiJHZW40Iiwic2l6ZSI6IlN0YW5kYXJkIiwiY2F0ZWdvcnlfaWQiOjEsInZlbmRvcl9pZCI6MX0sIHsiaWQiOjMsIm5hbWUiOiJHMTciLCJhZGRpdGlvbiI6IkdlbjQgIiwic2l6ZSI6IlN0YW5kYXJkIiwiY2F0ZWdvcnlfaWQiOjEsInZlbmRvcl9pZCI6MX0sIHsiaWQiOjQsIm5hbWUiOiJHMTdDIiwiYWRkaXRpb24iOiJHZW40Iiwic2l6ZSI6IlN0YW5kYXJkIiwiY2F0ZWdvcnlfaWQiOjEsInZlbmRvcl9pZCI6MX0sIHsiaWQiOjUsIm5hbWUiOiJHMTciLCJhZGRpdGlvbiI6IkdlbjUiLCJzaXplIjoiU3但我需要返回上面指定的 json
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

该查询返回包含 JSON 的单行和单列。使用此代码读取该单个值。


row, err := db.QueryRow("SELECT *FROM get_products()")

if err != nil {

    // handle error

}

var jsonData []byte

if err := row.Scan(&jsonData); err != nil {

        // handle error

}

c.Data(200, "application/json", jsonData)

无需对 JSON 进行解码和编码。按原样使用从数据库返回的 JSON 数据。


查看完整回答
反对 回复 2022-05-10
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我向您推荐这种静态查询的解决方案。


首先用于.Prepare创建准备好的语句。


db := gopg.Connect(&options)

pgStmt, err := pg.Prepare("SELECT *FROM get_products()")

if err != nil {

    log.panic(err)

}

现在,您可以简单地得到结果


var jsonData []byte

_, err := pgStmt.QueryOne(gopg.Scan(&jsonData))

if err != nil {

    log.panic(err)

}


c.Data(200, "application/json", jsonData)

您也可以将 json 作为字符串接收,然后将其转换为[]byte:


var json string

_, err := pgStmt.QueryOne(gopg.Scan(&json))

if err != nil {

    log.panic(err)

}


// do something with that json


jsonData := []byte(json)

c.Data(200, "application/json", jsonData)


查看完整回答
反对 回复 2022-05-10
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信