【问题标题】:Using Promise.all inside a transaction / task vs using t.batch in pg-promise在事务/任务中使用 Promise.all 与在 pg-promise 中使用 t.batch
【发布时间】:2020-06-13 19:00:00
【问题描述】:

文档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)));
});

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

【问题讨论】:

    标签: javascript postgresql pg-promise


    【解决方案1】:

    ES7 和async/await 的到来,消除了批量查询的需要。

    您可以简单地这样做:

    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

    【讨论】:

      猜你喜欢
      • 2022-12-11
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 2023-03-16
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      相关资源
      最近更新 更多