我是pg-promise的作者。
有两种插入多个记录的方法。第一种也是最典型的方法是通过事务来确保正确插入所有记录,或确保没有插入任何记录。
使用pg-promise可以通过以下方式完成:
db.tx(t => { const queries = lst.map(l => { return t.none('INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})', l); }); return t.batch(queries);}) .then(data => { // SUCCESS // data = array of null-s }) .catch(error => { // ERROR });您可以使用方法tx发起事务,然后创建所有
INSERT查询承诺,然后将它们全部批量解决。
第二种方法是将所有插入值连接到一个
INSERT查询中,我将在Performance
Boost中进行详细说明。。
有关更多示例,请参见任务和事务。
加成
值得指出的是,在大多数情况下,我们不插入记录
id,而是自动生成记录。有时我们想找回新的ID,而在其他情况下我们不在乎。
上面的示例使用
null-s
数组进行解析,因为批处理使用单个结果数组进行解析,而方法none均
null根据其API进行解析。
假设我们要生成新的id,并希望将它们全部收回。为此,我们将代码更改为以下内容:
db.tx(t => { const queries = lst.map(l => { return t.one('INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id', l, a => +a.id); }); return t.batch(queries);}) .then(data => { // SUCCESS // data = array of new id-s; }) .catch(error => { // ERROR });即更改是:
- 我们不插入
id
值 - 我们将方法none替换为one,以从每个插入中获取一行/对象
- 我们附加
RETURNING id
到查询以获取值 - 我们添加
a => +a.id
了执行自动行转换的功能。
更新
必读文章:数据导入。



