将JSON字符串数组设置为PostgreSQL表中的列

问题描述 投票:0回答:1

我是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数组的预期格式。

json postgresql node-postgres
1个回答
0
投票

考虑使用Parameterized queryPrepared statements。这将有助于您使用qoutes并获得针对SQL注入的保护作为奖励。

© www.soinside.com 2019 - 2024. All rights reserved.