PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Masywne wstawki z obietnicą pg

AKTUALIZUJ

Najlepiej przeczytać następujący artykuł:Import danych .

Jako autor pg-promise Musiałem w końcu udzielić właściwej odpowiedzi na to pytanie, ponieważ ta opublikowana wcześniej nie była tak naprawdę sprawiedliwa.

Aby wstawić ogromną/nieskończoną liczbę rekordów, Twoje podejście powinno opierać się na metodzie sekwencja , który jest dostępny w ramach zadań i transakcji.

var cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tableName'});

// returns a promise with the next array of data objects,
// while there is data, or an empty array when no more data left
function getData(index) {
    if (/*still have data for the index*/) {
        // - resolve with the next array of data
    } else {
        // - resolve with an empty array, if no more data left
        // - reject, if something went wrong
    }        
}

function source(index) {
    var t = this;
    return getData(index)
        .then(data => {
            if (data.length) {
                // while there is still data, insert the next bunch:
                var insert = pgp.helpers.insert(data, cs);
                return t.none(insert);
            }
            // returning nothing/undefined ends the sequence
        });
}

db.tx(t => t.sequence(source))
    .then(data => {
        // success
    })
    .catch(error => {
        // error
    });

Jest to najlepsze podejście do wstawiania ogromnej liczby wierszy do bazy danych, zarówno z punktu widzenia wydajności, jak i ograniczania obciążenia.

Wszystko, co musisz zrobić, to zaimplementować swoją funkcję getData zgodnie z logiką Twojej aplikacji, tj. skąd pochodzą Twoje duże dane, na podstawie index sekwencji, aby zwrócić około 1000 - 10 000 obiektów na raz, w zależności od wielkości obiektów i dostępności danych.

Zobacz także kilka przykładów API:

Powiązane pytanie:node-postgres z ogromną liczbą zapytań .

A w przypadkach, w których musisz uzyskać wygenerowane identyfikatory wszystkich wstawionych rekordów, możesz zmienić dwie linie w następujący sposób:

// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);

i

// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))

po prostu bądź ostrożny, ponieważ przechowywanie zbyt wielu identyfikatorów rekordów w pamięci może spowodować przeciążenie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Alternatywy dla array_agg()?

  2. Jak mogę uniemożliwić Postgresowi wstawianie podzapytania?

  3. Tworzenie kopii bazy danych w PostgreSQL

  4. Jak wykonać wiele zapytań za pomocą polecenia psql z powłoki bash?

  5. Jak przywrócić plik zrzutu PostgreSQL do baz danych Postgres?