使用pg-promise的大量插入物[英] Massive inserts with pg-promise

本文是小编为大家收集整理的关于使用pg-promise的大量插入物的处理方法,想解了使用pg-promise的大量插入物的问题怎么解决?使用pg-promise的大量插入物问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在使用 pg-promise 并且我想进行多次插入一张桌子.我见过一些解决方案,例如 Multi-row insert with pg-promise如何正确地将多行插入PG 与 node-postgres?,我可以使用 pgp.helpers.concat 来连接多个选择.

但是现在,我需要在一个表中插入很多测量值,超过 10,000 条记录,并且在 https://github.com/vitaly-t/pg-promise/wiki/Performance-Boost 说:"你可以像这样连接多少条记录 - 取决于记录的大小,但我永远不会用这种方法超过 10,000 条记录.所以如果你必须插入更多的记录,你会想要将它们分成这样的连接批次然后一一执行."

我阅读了所有文章,但不知道如何将我的插入"拆分"成批次,然后一个接一个地执行.

谢谢!

推荐答案

更新

最好阅读以下文章:数据导入.

<小时>

作为 pg-promise 的作者,我不得不最终提供权利回答这个问题,因为之前发布的那个并没有真正做到公正.

为了插入大量/无限数量的记录,您的方法应该基于方法 序列,在任务和事务中可用.

var cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tableName'});

// returns a promise with the next array of data objects,
// while there is data, or an empty array when no more data left
function getData(index) {
    if (/*still have data for the index*/) {
        // - resolve with the next array of data
    } else {
        // - resolve with an empty array, if no more data left
        // - reject, if something went wrong
    }        
}

function source(index) {
    var t = this;
    return getData(index)
        .then(data => {
            if (data.length) {
                // while there is still data, insert the next bunch:
                var insert = pgp.helpers.insert(data, cs);
                return t.none(insert);
            }
            // returning nothing/undefined ends the sequence
        });
}

db.tx(t => t.sequence(source))
    .then(data => {
        // success
    })
    .catch(error => {
        // error
    });

从性能和负载限制的角度来看,这是向数据库中插入大量行的最佳方法.

你所要做的就是根据你的应用程序的逻辑实现你的函数getData,即你的大数据来自哪里,基于序列的index,返回大约1,000 - 10,000个对象一个时间,取决于对象的大小和数据的可用性.

另见一些 API 示例:

<小时>

相关问题:具有大量查询的node-postgres.

<小时>

如果您需要获取所有插入记录的生成 id-s,您可以将这两行更改如下:

// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);

// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))

请小心,因为在内存中保留过多的记录 ID 会导致过载.

本文地址:https://www.itbaoku.cn/post/1764018.html