使用对象键作为列名将对象的JSON数组插入PostgreSQL

时间:2018-10-10 15:50:15

标签: javascript sql json postgresql

我有一个用Javascript编写的应用程序,它使用postgreSQL(9.6)DB来存储数据。 有没有一种方法可以将Javascript对象直接插入DB中?

我创建了这个示例表:

CREATE TABLE people (
  "uuid" uuid PRIMARY KEY,
  "name" text NOT NULL,
  "phone" number
); 

应用中的Javascript对象:

{
  uuid: 'df7c5fdc-d6b7-4b5e-ac3b-1228fac64a90',
  name: 'Martin',
  phone: 123456
}

现在,我有一系列不同的人(上面的对象阵列),我设法以这种方式将其插入数据库:

let uuids = people.map(p => `'${p.uuid}'`) // adding quotes, otherwise syntax error
let names = people.map(p => `'${p.name}'`)
let phones = people.map(p => `'${p.phone}'`)

INSERT INTO people (
  "uuid",
  "name",
  "phone"
)
VALUES (
  UNNEST(ARRAY[${uuids}])::uuid,
  UNNEST(ARRAY[${names}])::text,
  UNNEST(ARRAY[${phones}])::number
)

有没有一种方法可以更有效地做到这一点?像在mongo db.collection.insertMany(array)中一样?另外,我想省略一些值并使用NULL,在此示例中是不可能的。

我正在PostgreSQL文档中搜索,有几个函数可以使用json,但我找不到适合的函数。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

有机会测试json_to_recordset()

INSERT INTO people("uuid", name, phone)
SELECT "uuid", name, phone
FROM json_to_recordset(?) AS x("uuid" uuid, name text, phone int);

占位符应绑定到您所描述的对象数组上(当然,使用正确的JSON除外)。

sqlfiddle example