猿问

Golang 从 postgres 获取原始 json

我在我的 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


红糖糍粑
浏览 102回答 2
2回答

森栏

该查询返回包含 JSON 的单行和单列。使用此代码读取该单个值。row, err := db.QueryRow("SELECT *FROM get_products()")if err != nil {    // handle error}var jsonData []byteif err := row.Scan(&jsonData); err != nil {        // handle error}c.Data(200, "application/json", jsonData)无需对 JSON 进行解码和编码。按原样使用从数据库返回的 JSON 数据。

慕运维8079593

我向您推荐这种静态查询的解决方案。首先用于.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 jsonjsonData := []byte(json)c.Data(200, "application/json", jsonData)
随时随地看视频慕课网APP

相关分类

Go
我要回答