sql >> Databáze >  >> RDS >> PostgreSQL

Masivní vložky s pg-promise

AKTUALIZACE

Nejlepší je přečíst si následující článek:Importy dat .

Jako autor pg-promise Byl jsem donucen konečně poskytnout správnou odpověď na otázku, protože ta, která byla zveřejněna dříve, to ve skutečnosti nesplňovala.

Aby bylo možné vložit masivní/nekonečný počet záznamů, měl by být váš přístup založen na metodě sekvence , který je dostupný v rámci úkolů a transakcí.

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

Toto je nejlepší přístup k vkládání velkého počtu řádků do databáze, a to jak z hlediska výkonu, tak z hlediska omezení zatížení.

Jediné, co musíte udělat, je implementovat vaši funkci getData podle logiky vaší aplikace, tj. odkud pocházejí vaše velká data, na základě index sekvence, aby bylo možné vrátit 1 000 - 10 000 objektů najednou, v závislosti na velikosti objektů a dostupnosti dat.

Viz také některé příklady rozhraní API:

Související otázka:node-postgres s velkým množstvím dotazů .

A v případech, kdy potřebujete získat vygenerovaná ID všech vložených záznamů, změnili byste dva řádky následovně:

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

a

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

buďte opatrní, protože příliš mnoho ID záznamů v paměti může způsobit přetížení.



  1. Snažím se jednoduchý dotaz s parametrem v mysql 5.5 přes kód jdbc

  2. MySQL:aktualizace bez změny dat, možná?

  3. CakePHP dotaz na nejbližší zeměpisnou šířku a délku z databáze

  4. seskupit pomocí přidáním hodnot