将 JSON 字符串数组设置为 PostgreSQL 表中的列
Posted
技术标签:
【中文标题】将 JSON 字符串数组设置为 PostgreSQL 表中的列【英文标题】:Setting a JSON array of strings as a column in a PostgreSQL table 【发布时间】:2018-03-01 11:46:47 【问题描述】:我是 SQL 的初学者(您很快就会知道...),我终其一生都无法弄清楚如何最好地将简单的 JSON 字符串数组插入到 PostgreSQL 表中。我怀疑解决方案很简单,但我花了很长时间试图自己解决这个问题。
首先我创建表:
CREATE TABLE test (
id serial PRIMARY KEY
my_array jsonb
);
数组的类型为JSON。插入一些初始数据:
INSERT INTO test (id, my_array) VALUES(1, '[]');
现在我想使用 Node.js node-postgres 使用 JSON 数组更新 myarray
列。数组可能看起来像
const myArray = ['foo', 'bar', 'foobar\'s escaped character emporium'];
await db.none(
'UPDATE test ' +
`SET my_array = $myArray ` +
'WHERE id = 1'
);
这会导致
error: syntax error at or near ","
好的,如果我这样做了怎么办
await db.none(
'UPDATE test ' +
`SET my_array = "$myArray" ` +
'WHERE id = 1'
);
我明白了
error: column "foo,bar,foobar's escaped character emporium" does not exist
如果我这样做了
await db.none(
'UPDATE test ' +
`SET my_array = $JSON.stringify(myArray) ` +
'WHERE id = 1'
);
我明白了
ERROR error: syntax error at or near "["
最后,如果我这样做了
await db.none(
'UPDATE test ' +
`SET my_array = '$JSON.stringify(myArray)' ` +
'WHERE id = 1'
);
我结束了
stack=error: syntax error at or near "s"
我也尝试将数据数据存储为native PostgreSQL array,但我遇到了类似的问题:
CREATE TABLE test (
id serial PRIMARY KEY
my_array text ARRAY
);
INSERT INTO test (id, my_array) VALUES(1, '');
然后
const myArray = ['foo', 'bar', 'foobar\'s escaped character emporium'];
await db.none(
'UPDATE test ' +
`SET my_array = $myArray ` +
'WHERE id = 1'
);
给予
stack=error: syntax error at or near ","
使用JSON.stringify()
的类似变体以及不同引号的组合也被证明是徒劳的。我有点预计这种方法不太可能起作用,因为 PostgreSQL 数组只是一种不同的格式,但我希望可能会有某种强制尝试。通读文档,我找不到任何将 JSON 数组转换为 PostgreSQL 数组的预期格式的明显方法。
【问题讨论】:
你的问题是单引号'
你需要用 `\` 来转义它(我认为)
@CelsoLívero 哪个单引号对不起?他们中的一些人在敲门......
所有这些,你必须使用转义字符来插入,例如:假设我想在一个列中插入“baba o'riley”,我应该这样做:INSERT INTO table (列)值('baba o\'riley')
据我所知,数组元素(字符串)中的单引号已经被转义了。它们被JSON.stringify()
转义,但那是因为它将每个元素封装在双引号中。你是说我应该在结果字符串中使用JSON.stringify()
和 then 转义单引号,然后 then 用单引号包围整个内容?
您将 ES6 模板字符串与常规字符串 + pg-promise 字符串格式混合在一起,所以您不知道那里发生了什么,生成了无效的 SQL。您应该坚持一种语法,然后相应地更新 SQL 格式。
【参考方案1】:
考虑使用Parameterized query 或Prepared statements。 这将帮助您处理 qoutes 并获得针对 SQL 注入的保护作为奖励。
【讨论】:
参数化查询是一种享受!谢谢!对于后代,有效的查询是await db.none( 'UPDATE test ' + 'SET my_array = $myArray ' + 'WHERE id = 1', myArray );
。当我尝试这个my_array
时,输入了text[]
。
这个问题与参数化查询或准备好的语句无关。他只需要修复他的 SQL 查询格式。把他带到另一个模块不是解决办法。
实际上,我并没有将他指向另一个模块。他说他在他的问题中使用了那个特定的模块。此外,通过字符串连接构建查询是一种不好的做法。看到这个问题:***.com/questions/28473476/…以上是关于将 JSON 字符串数组设置为 PostgreSQL 表中的列的主要内容,如果未能解决你的问题,请参考以下文章
将数组转换为有效的JSON字符串,而不使用JSON.stringify?