Использование Promise.all внутри транзакции / задачи против использования t.batch в pg-promise - PullRequest
1 голос
/ 01 марта 2020

В документации здесь четко указано, что писать

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

, который выполняет запросы к root протоколу базы данных, - плохая практика. Следовательно, лучше написать

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

Похоже, он все еще использует протокол общего соединения вместо root соединения.

1 Ответ

1 голос
/ 01 марта 2020

Приход 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)));

Для этого потребуется асин c для каждой функции, подобной этой:

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

Но обычно вам не нужно ничего из этого при выполнении массива вставки, потому что для этого вы должны использовать многорядные вставки вместо.

...