将 JSON 字符串数组设置为 PostgreSQL table 中的列
Setting a JSON array of strings as a column in a PostgreSQL table
我是 SQL 的初学者(您很快就会知道...),我一辈子都想不出如何最好地插入一个简单的 JSON 将字符串数组转换为 PostgreSQL table。我怀疑解决方案很简单,但我花了太长时间试图自己解决这个问题。
首先我创建 table:
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 数组的预期格式。
考虑使用 Parameterized query or Prepared statements。
这将帮助您获得报价并获得针对 SQL 注入的保护作为奖励。
我是 SQL 的初学者(您很快就会知道...),我一辈子都想不出如何最好地插入一个简单的 JSON 将字符串数组转换为 PostgreSQL table。我怀疑解决方案很简单,但我花了太长时间试图自己解决这个问题。
首先我创建 table:
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 数组的预期格式。
考虑使用 Parameterized query or Prepared statements。 这将帮助您获得报价并获得针对 SQL 注入的保护作为奖励。