web-dev-qa-db-fra.com

Comment faire de l'insertion en bloc en utilisant Sequelize et node.js

js + sequelize pour insérer 280K lignes de données en utilisant JSON. Le JSON est un tableau de 280K. Existe-t-il un moyen de faire de l'insertion en vrac en morceaux. Je constate qu'il faut beaucoup de temps pour mettre à jour les données. Lorsque j'ai essayé de réduire les données à 40 000 lignes, cela fonctionne rapidement. Suis-je en train de prendre la bonne approche. Veuillez conseiller. J'utilise postgresql comme backend.

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

        });
13
Uma Maheshwaraa

J'ai utilisé l'utilitaire cargo de la bibliothèque asynchrone pour charger jusqu'à 1 000 lignes à la fois. Voir le code suivant pour charger un csv dans une base de données:

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

Vous pouvez utiliser la méthode bulkCreate intégrée de Sequelize pour y parvenir.

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 | Création et mise à jour en masse

5
Clement

Si vous voulez vraiment utiliser bulkInsert, ma réponse précédente est suffisante. Cependant, vous manquerez de mémoire si vous avez beaucoup de données! Il est préférable d'utiliser une méthode de base de données intégrée pour cela. Le problème est que vous chargez toutes les données en mémoire jusqu'à ce que le bulkCreate s'exécute. Si vous avez un million de lignes, vous manquerez probablement de mémoire avant même qu'elle ne s'exécute. Même si vous le mettez en file d'attente à l'aide de quelque chose comme async.cargo , vous attendez toujours que la base de données vous revienne à tous pendant que les données consomment de manière asynchrone toute votre mémoire.

Ma solution était d'abandonner les séquelles pour le chargement des données (au moins jusqu'à ce qu'elles implémentent le streaming ou quelque chose (voir leur github issue # 2454 )). J'ai fini par créer db-streamer , mais il n'a pour l'instant que le support pg. Vous voudrez regarder streamsql pour mysql.

1
Evan Siroky

La question suivante a la même réponse que vous avez besoin ici: NodeJS, promesses, flux - traitement de gros fichiers CSV

  • utiliser un flux pour lire les données et les analyser;
  • utilisez la combinaison des méthodes stream.read et sequence from spex pour lire le flux et exécuter les requêtes une par une.
1
vitaly-t