在事务/任务中使用 Promise.all 与在 pg-promise 中使用 t.batch
Using Promise.all inside a transaction / task vs using t.batch in pg-promise
文档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
或查询duration
(ref),这样写是不是错了?
db.task(async t => {
await Promise.all(data.map(d => t.none('insert into...', d)));
});
看起来,它仍然使用共享连接协议而不是根连接。
随着 async/await
ES7 的到来,消除了对批量查询的需求。
您可以简单地改为这样做:
await db.task(async t => {
await forEachAsync(data, d => t.none('insert into...', d));
});
或只是 return 结果:
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);
}
}
但通常情况下,执行插入数组时不需要任何这些,因为为此您应该使用 。
文档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
或查询duration
(ref),这样写是不是错了?
db.task(async t => {
await Promise.all(data.map(d => t.none('insert into...', d)));
});
看起来,它仍然使用共享连接协议而不是根连接。
随着 async/await
ES7 的到来,消除了对批量查询的需求。
您可以简单地改为这样做:
await db.task(async t => {
await forEachAsync(data, d => t.none('insert into...', d));
});
或只是 return 结果:
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);
}
}
但通常情况下,执行插入数组时不需要任何这些,因为为此您应该使用