Jestem autorem pg-promise .
Istnieją dwa sposoby wstawiania wielu rekordów. Pierwszym i najbardziej typowym sposobem jest transakcja, aby upewnić się, że wszystkie rekordy są wstawione poprawnie lub żaden z nich.
Z pg-promise odbywa się to w następujący sposób:
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
});
Transakcję inicjujesz za pomocą metody tx
, a następnie utwórz wszystkie INSERT
obietnice zapytań, a następnie rozwiąż je wszystkie jako partie
.
Drugie podejście polega na połączeniu wszystkich wstawianych wartości w jednym INSERT
zapytanie, które szczegółowo wyjaśniam w Zwiększenie wydajności
. Zobacz też:Wkładka wielorzędowa z pg-promise .
Więcej przykładów znajdziesz w Zadania i Transakcje .
Dodanie
Warto zaznaczyć, że w większości przypadków nie wstawiamy rekordu id
, raczej generuj go automatycznie. Czasami chcemy odzyskać nowe identyfikatory, a w innych nie obchodzi nas to.
Powyższe przykłady rozwiązywane są za pomocą tablicy null
-s, ponieważ partia
rozwiązuje się z tablicą pojedynczych wyników i metodą none
rozwiązuje z null
, zgodnie z jego API.
Załóżmy, że chcemy wygenerować nowe identyfikatory i że chcemy je wszystkie odzyskać. Aby to osiągnąć, zmienilibyśmy kod na następujący:
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
});
czyli zmiany to:
- nie wstawiamy
id
wartości - zamieniamy metodę brak z jeden , aby uzyskać jeden wiersz/obiekt z każdej wstawki
- dodajemy
RETURNING id
do zapytania, aby uzyskać wartość - dodajemy
a => +a.id
aby wykonać automatyczną transformację wiersza. Zobacz też pg-promise zwraca liczby całkowite jako ciągi aby zrozumieć, co to+
jest dla.
AKTUALIZACJA-1
Dla wysokowydajnego podejścia za pomocą jednej INSERT
zapytanie patrz Wstawianie wielu wierszy z pg-promise .
AKTUALIZACJA-2
Artykuł, który trzeba przeczytać:Import danych .