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

Posted

技术标签:

【中文标题】将 JSON 字符串数组设置为 PostgreSQL 表中的列【英文标题】:Setting a JSON array of strings as a column in a PostgreSQL table 【发布时间】: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 格式。 【参考方案1】:

考虑使用Parameterized query 或Prepared statements。 这将帮助您处理 qoutes 并获得针对 SQL 注入的保护作为奖励。

【讨论】:

参数化查询是一种享受!谢谢!对于后代,有效的查询是await db.none( 'UPDATE test ' + 'SET my_array = $myArray ' + 'WHERE id = 1', myArray );。当我尝试这个my_array 时,输入了text[] 这个问题与参数化查询或准备好的语句无关。他只需要修复他的 SQL 查询格式。把他带到另一个模块不是解决办法。 实际上,我并没有将他指向另一个模块。他说他在他的问题中使用了那个特定的模块。此外,通过字符串连接构建查询是一种不好的做法。看到这个问题:***.com/questions/28473476/…

以上是关于将 JSON 字符串数组设置为 PostgreSQL 表中的列的主要内容,如果未能解决你的问题,请参考以下文章

将数组转换为有效的JSON字符串,而不使用JSON.stringify?

如何将数组值插入现有的 JSON 文档?

Angular UI Select2,为啥将 ng-model 设置为 JSON 字符串?

如何将Json数组字符串转化为Json的List

如何将json字符串转换为数组

将 JSON 数组字符串转换为 JSON 数组返回 null