将 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 注入的保护作为奖励。