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

Вмъкване на множество записи с pg-promise

Аз съм автор на pg-promise .

Има два начина за вмъкване на множество записи. Първият и най-типичен начин е чрез транзакция, за да се уверите, че всички записи са вмъкнати правилно или нито един от тях.

С pg-promise става по следния начин:

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

Инициирате транзакция с метод tx , след което създайте всички INSERT обещания за заявки и след това ги разрешите всички като партида .

Вторият подход е чрез обединяване на всички вмъкнати стойности в един INSERT заявка, която обяснявам подробно в Повишаване на производителността . Вижте също:Вмъкване на много редове с pg-promise .

За повече примери вижте Задачи и Транзакции .

Допълнение

Струва си да се отбележи, че в повечето случаи не вмъкваме запис id , по-скоро да се генерира автоматично. Понякога искаме да си върнем новите идентификатори, а в други случаи не ни пука.

Примерите по-горе се разрешават с масив от null -s, защото партида разрешава с масив от отделни резултати и метод няма разрешава с null , според неговия API.

Да приемем, че искаме да генерираме новите идентификатори и че искаме да ги върнем всички обратно. За да постигнем това, ще променим кода на следния:

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

т.е. промените са:

  • ние не вмъкваме id стойности
  • заменяме метода няма с един , за да получите един ред/обект от всяко вмъкване
  • добавяме RETURNING id към заявката, за да получите стойност
  • добавяме a => +a.id за да направите автоматичната трансформация на реда. Вижте също pg-promise връща цели числа като низове за да разберете какво е това + е за.

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

За подход с висока производителност чрез един INSERT заявка вижте Вмъкване на много редове с pg-promise .

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

Задължителна статия:Импортиране на данни .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. вложено избиране с помощта на count за преброяване на всеки ред в Postgres

  2. След импортиране на данни в PostgreSQL, дублираната стойност на ключ нарушава уникалното ограничение

  3. Времето за изчакване на връзката на обвивката на външни данни в Cloud SQL (postgres) е изтекло за екземпляр на реплика

  4. ActiveRecord::StatementInvalid. PG грешка

  5. Не може да се създаде роля на суперпотребител на PostgreSQL, за да се инсталира и стартира приложение