我是SQL的初学者(因为你很快就能说出来......)而且我不能为我的生活弄清楚如何最好地将一个简单的JSON字符串数组插入到PostgreSQL表中。我怀疑这个解决方案很简单,但是我花了很长时间试图自己解决这个问题。
首先我创建表:
CREATE TABLE test (
id serial PRIMARY KEY
my_array jsonb
);
数组的类型为JSON。插入一些初始数据:
INSERT INTO test (id, my_array) VALUES(1, '[]');
现在我想用Node.js myarray
用JSON数组更新node-postgres列。该数组可能看起来像
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数组的预期格式。
考虑使用Parameterized query或Prepared statements。这将有助于您使用qoutes并获得针对SQL注入的保护作为奖励。