在事务/任务中使用Promise.all,而在pg-promise中使用t.batch

问题描述 投票:1回答:1

[文档here清楚地概述了这样做是一种不良做法

Promise.all(data.map(d => db.none('insert into...', d)))

正在针对根数据库协议进行查询。因此最好写

db.task(t => t.batch(data.map(d => t.none('insert into...', d))));

但是,如果我不打算使用BatchError或查询durationref),写这个错误吗?

db.task(async t => {
  await Promise.all(data.map(d => t.none('insert into...', d)));
});

从外观上看,它仍然使用共享连接协议,而不是根连接。

javascript postgresql pg-promise
1个回答
1
投票

[带有async/await的ES7的出现,消除了批量查询的需要。

您可以简单地执行此操作:

await db.task(async t => {
    await forEachAsync(data, d => t.none('insert into...', d));
});

或仅返回结果:

await db.task(t => forEachAsync(data, d => t.none('insert into...', d)));

这将需要异步for-each函数,如下所示:

async function forEachAsync(data, cb) {
    for (let i = 0; i < data.length; i ++) {
        await cb(data[i], i, data);
    }
}

但是,通常,执行插入数组时不需要任何这些,因为为此您应该使用multi-row inserts

© www.soinside.com 2019 - 2024. All rights reserved.