【发布时间】: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 格式。
标签: json postgresql node-postgres