一尘不染

用pg-promise插入多个记录

node.js

我有一个需要插入多个记录的场景。我有一个表结构,如id(其他表中的fk),key(char),value(char)。需要保存的输入将是上述数据的数组。示例:我有一些数组对象,例如:

lst = [];



obj = {};

obj.id= 123;

obj.key = 'somekey';

obj.value = '1234';

lst.push(obj);



obj = {};

obj.id= 123;

obj.key = 'somekey1';

obj.value = '12345';

lst.push(obj);

在MS SQL中,我将创建并传递TVP。我不知道如何在postgres中实现。所以现在我要做的是使用pg-
promise库将列表中的所有项目保存在postgres sql中的单个查询中。我找不到任何文档/无法从文档中了解。任何帮助表示赞赏。谢谢。


阅读 175

收藏
2020-07-07

共1个答案

一尘不染

我是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了执行自动行转换的功能。

更新

必读文章:数据导入

2020-07-07