PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Sisipan besar-besaran dengan janji pg

PERBARUI

Yang terbaik adalah membaca artikel berikut:Impor Data .

Sebagai penulis pg-promise Saya terpaksa akhirnya memberikan jawaban yang tepat untuk pertanyaan itu, karena yang diterbitkan sebelumnya tidak benar-benar adil.

Untuk memasukkan catatan dalam jumlah besar/tak terbatas, pendekatan Anda harus didasarkan pada metode urutan , yang tersedia dalam tugas dan transaksi.

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

Ini adalah pendekatan terbaik untuk memasukkan sejumlah besar baris ke dalam database, baik dari sudut pandang kinerja maupun pembatasan beban.

Yang harus Anda lakukan adalah mengimplementasikan fungsi Anda getData sesuai dengan logika aplikasi Anda, yaitu dari mana data besar Anda berasal, berdasarkan index urutan, untuk mengembalikan sekitar 1.000 - 10.000 objek sekaligus, tergantung pada ukuran objek dan ketersediaan data.

Lihat juga beberapa contoh API:

Pertanyaan terkait:node-postgres dengan sejumlah besar kueri .

Dan dalam kasus di mana Anda perlu memperoleh id-s yang dihasilkan dari semua catatan yang dimasukkan, Anda akan mengubah dua baris sebagai berikut:

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

dan

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

hati-hati saja, karena menyimpan terlalu banyak id-record di memori dapat menyebabkan kelebihan beban.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. String keluaran psql postgres tanpa karakter pelarian

  2. INSERT a SELECT GROUP BY :lebih banyak kolom target daripada kesalahan ekspresi

  3. Permintaan untuk memeriksa status basis data postgresql

  4. Bagaimana menjaga data tidak mengurutkan?

  5. Cara memasukkan dan menghapus data di PostgreSQL