PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Масивни вложки с pg-обещание

АКТУАЛИЗАЦИЯ

Най-добре е да прочетете следната статия:Импортиране на данни .

Като автор на pg-promise Бях принуден най-накрая да дам правилния отговор на въпроса, тъй като този, публикуван по-рано, всъщност не го представи правилно.

За да вмъкнете огромен/безкраен брой записи, вашият подход трябва да се основава на метод последователност , който е достъпен в задачите и транзакциите.

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

Това е най-добрият подход за вмъкване на огромен брой редове в базата данни както от гледна точка на производителността, така и от ограничаване на натоварването.

Всичко, което трябва да направите, е да внедрите вашата функция getData според логиката на вашето приложение, т.е. откъде идват вашите големи данни, въз основа на index от последователността, за да върне около 1000 - 10 000 обекта наведнъж, в зависимост от размера на обектите и наличността на данни.

Вижте също някои примери за API:

Свързан въпрос:node-postgres с огромно количество заявки .

И в случаите, когато трябва да придобиете генерирани идентификатори на всички вмъкнати записи, бихте променили двата реда, както следва:

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

и

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

просто бъдете внимателни, тъй като съхраняването на твърде много идентификатори на записи в паметта може да доведе до претоварване.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Опитвам се да конструирам PostgreSQL Query за извличане от JSON на текстова стойност в обект, в масив, в обект, в масив, в обект

  2. Споделете връзка с postgres db между процеси в Python

  3. Как да генерирам CREATE скрипт за няколко таблици в pgAdmin III?

  4. PostgreSQL рекурсивна заявка родител/дете

  5. Как да създадете потребител само за четене в PostgreSQL?