如何在Postgres中向json字段数组添加元素

问题描述 投票:1回答:1

我正在尝试将数据附加到属于postgres中的json字段的数组中。使用pgAdmin时,我知道以下查询有效。 〜

UPDATE lesson SET data =
    jsonb_set (data, '{pages, 999999}', '{"pageNum": 2, "pageType": "voc"}', True)
WHERE id = 2;

我只是试图通过我写的go中的其余api来使上述查询工作。我收到一条错误,上面写着“pq:json类型的无效输入语法”。

我的代码如下〜

_, err := db.Exec(`
    UPDATE lessons SET data =
        jsonb_set (data, '{pages, 999999}','{"pageNum": $1, "pageType": $2}', True) 
    WHERE id = $3`,
    pageNum, pageType, id) // variable types are int string int

我怀疑postgres驱动程序没有插入$参数。如果我对整个查询使用fmt.Sprinf(),但我试图避免SQL注入攻击,并希望利用go sql库的内置安全措施,它将起作用。

作为参考,我的数据结构如下〜课程表

Lessons
   id    int
   data  jsonb

结构:

type Lesson struct {
    ID    int    `json:"id"`
    Name  string  `json:"name"`
    Pages []Page  `json:"pages"`
}

type Page struct {
    PageNum    int  `json:"pageNum"`
    PageType   string `json:"pageType"`
postgresql go
1个回答
3
投票

您不能在Postgres中的字符串中使用查询参数。将整个字符串作为单个参数传递给Postgres:

str := fmt.Sprintf('{"pageNum": %d, "pageType": %q}', pageNum, pageType)
_, err := db.Exec(`
    UPDATE lessons SET data =
        jsonb_set (data, '{pages, 999999}', $1, True) 
    WHERE id = $2`,
    str, id) // variable types are int string int

或使用string concatenation在服务器端执行此操作:

_, err := db.Exec(`
    UPDATE lessons SET data =
        jsonb_set (data, '{pages, 999999}','{"pageNum": ' || $1 || ', "pageType": ' || $2 || '}', True) 
    WHERE id = $3`,
    pageNum, pageType, id) // variable types are int string int

最好/最安全,可能是第一种方法,在您的客户端使用完整的JSON封送,而不是简单的fmt.Sprintf。我把它作为读者的练习。

© www.soinside.com 2019 - 2024. All rights reserved.