sql >> Database teknologi >  >> RDS >> PostgreSQL

Massive skær med pg-løfte

OPDATERING

Det bedste er at læse følgende artikel:Dataimport .

Som forfatter til pg-promise Jeg var tvunget til endelig at give det rigtige svar på spørgsmålet, da det tidligere offentliggjorte ikke rigtig gjorde det retfærdigt.

For at indsætte et massivt/uendeligt antal poster, bør din tilgang være baseret på metoden sekvens , der er tilgængelig inden for opgaver og transaktioner.

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

Dette er den bedste tilgang til at indsætte et stort antal rækker i databasen, både set fra ydeevnesynspunkt og belastningsbegrænsning.

Alt du skal gøre er at implementere din funktion getData i henhold til logikken i din app, dvs. hvor dine store data kommer fra, baseret på index af sekvensen for at returnere omkring 1.000 - 10.000 objekter ad gangen, afhængigt af størrelsen af ​​objekter og datatilgængelighed.

Se også nogle API-eksempler:

Relateret spørgsmål:node-postgres med enorme mængder af forespørgsler .

Og i tilfælde, hvor du har brug for at erhverve genererede id-er for alle de indsatte poster, vil du ændre de to linjer som følger:

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

og

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

Bare vær forsigtig, da det kan skabe en overbelastning at holde for mange registrerings-id'er i hukommelsen.



  1. Hvordan implementerer jeg denne mySQL-forespørgsel korrekt i en PHP-fil og viser resultaterne?

  2. forbinde AngularJS til mysql ved hjælp af min PHP-tjeneste?

  3. Heroku - Kan ikke oprette forbindelse til lokal MySQL-server

  4. SQL Server 2016:Opret en databasebruger