我正在尝试将数据附加到属于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"`
您不能在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
。我把它作为读者的练习。