Аз съм автор на pg-promise .
Има два начина за вмъкване на множество записи. Първият и най-типичен начин е чрез транзакция, за да се уверите, че всички записи са вмъкнати правилно или нито един от тях.
С pg-promise става по следния начин:
db.tx(t => {
const queries = lst.map(l => {
return t.none('INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})', l);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of null-s
})
.catch(error => {
// ERROR
});
Инициирате транзакция с метод tx
, след което създайте всички INSERT
обещания за заявки и след това ги разрешите всички като партида
.
Вторият подход е чрез обединяване на всички вмъкнати стойности в един INSERT
заявка, която обяснявам подробно в Повишаване на производителността
. Вижте също:Вмъкване на много редове с pg-promise .
За повече примери вижте Задачи и Транзакции .
Допълнение
Струва си да се отбележи, че в повечето случаи не вмъкваме запис id
, по-скоро да се генерира автоматично. Понякога искаме да си върнем новите идентификатори, а в други случаи не ни пука.
Примерите по-горе се разрешават с масив от null
-s, защото партида
разрешава с масив от отделни резултати и метод няма
разрешава с null
, според неговия API.
Да приемем, че искаме да генерираме новите идентификатори и че искаме да ги върнем всички обратно. За да постигнем това, ще променим кода на следния:
db.tx(t => {
const queries = lst.map(l => {
return t.one('INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id',
l, a => +a.id);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of new id-s;
})
.catch(error => {
// ERROR
});
т.е. промените са:
- ние не вмъкваме
id
стойности - заменяме метода няма с един , за да получите един ред/обект от всяко вмъкване
- добавяме
RETURNING id
към заявката, за да получите стойност - добавяме
a => +a.id
за да направите автоматичната трансформация на реда. Вижте също pg-promise връща цели числа като низове за да разберете какво е това+
е за.
АКТУАЛИЗАЦИЯ-1
За подход с висока производителност чрез един INSERT
заявка вижте Вмъкване на много редове с pg-promise .
АКТУАЛИЗАЦИЯ-2
Задължителна статия:Импортиране на данни .