web-dev-qa-db-ja.com

Sequelizeとnode.jsを使用して一括挿入を行う方法

js + sequelizeは、JSONを使用して280K行のデータを挿入します。 JSONは280Kの配列です。チャンクで一括挿入する方法はありますか?データの更新に時間がかかることがわかりました。データを4万行に削減しようとしたところ、すばやく動作しました。私は正しいアプローチを取っていますか?アドバイスを下さい。私はpostgresqlをバックエンドとして使用しています。

PNs.bulkCreate(JSON_Small)
        .catch(function(err) {
            console.log('Error ' + err);
        })
        .finally(function(err) {
            console.log('FINISHED  + ' \n +++++++ \n');

        });
13
Uma Maheshwaraa

非同期ライブラリの cargo ユーティリティを使用して、一度に最大1000行をロードしました。 csvをデータベースにロードするには、次のコードを参照してください。

var fs = require('fs'),
    async = require('async'),
    csv = require('csv');

var input = fs.createReadStream(filename);
var parser = csv.parse({
  columns: true,
  relax: true
});
var inserter = async.cargo(function(tasks, inserterCallback) {
    model.bulkCreate(tasks).then(function() {
        inserterCallback(); 
      }
    );
  },
  1000
);
parser.on('readable', function () {
  while(line = parser.read()) {
    inserter.Push(line);
  }
});
parser.on('end', function (count) {
  inserter.drain = function() {
    doneLoadingCallback();
  }
});
input.pipe(parser);
4
Evan Siroky

これを実現するには、Sequelizeの組み込みbulkCreateメソッドを使用できます。

User.bulkCreate([
  { username: 'barfooz', isAdmin: true },
  { username: 'foo', isAdmin: true },
  { username: 'bar', isAdmin: false }
]).then(() => { // Notice: There are no arguments here, as of right now you'll have to...
  return User.findAll();
}).then(users => {
  console.log(users) // ... in order to get the array of user objects
})

Sequelize |一括作成および更新

5
Clement

本当にbulkInsertを使用したい場合は、以前の回答で十分です。ただし、大量のデータがあると、メモリが不足します。これには、組み込みのデータベースメソッドを使用するのが最善です。問題は、bulkCreateが実行されるまで、すべてのデータをメモリにロードしていることです。 100万行を取得した場合、実行する前にメモリ不足になる可能性があります。それでも、 async.cargo のようなものを使用してキューに入れると、データが非同期にすべてのメモリを消費している間、dbがあなたに戻ってくるのを待っています。

私の解決策は、データをロードするために逐次化を破棄することでした(少なくともストリーミングまたは何かを実装するまで( github issue#2454 を参照))。最終的に db-streamer を作成しましたが、今のところpgがサポートされています。 mysqlの streamsql を確認する必要があります。

1
Evan Siroky

次の質問には、ここで必要な同じ答えがあります: NodeJS、promises、streams-大きなCSVファイルの処理

  • ストリームを使用してデータを読み取り、解析します。
  • メソッド stream.readsequence from spex の組み合わせを使用して、ストリームを読み取り、クエリを1つずつ実行します。
1
vitaly-t