Node.js + секвестировать объемную вставку

Olivier спросил: 12 мая 2018 в 04:36 в: node.js

Я новичок в node.js и sequelize. Я уже построил mysql db с sequelize, который соответствует моим потребностям для фактического проекта.

Затем я искал возможности для заполнения db с помощью sequelize, и подход, чтобы объединить его с файлами csv, кажется, является лучшее решение для меня.

У меня есть три файла csv для трех отдельных таблиц, и нашел сценарий Эвана на github https://gist.github.com/evansiroky/167f218bb5342bff80c6#file-sequelizebulkinsert-js

Может кто-нибудь помочь мне, как мне нужно реализовать его, чтобы выполнить эту работу? Я знаю, что это должен быть очень простой вопрос, но я не знаю, как это сделать.


1 ответ

Есть решение
Edudjr ответил: 13 мая 2018 в 05:31

Если вы просто хотите заполнить свою БД данными, вы все равно можете сделать это по-старому, используя mysqlimport или другие инструменты mysql.

Если это то, что вы часто будете делать, возможно вы можете попытаться создать функцию, которая вызывается сценарием sequelizeBulkInsert, предполагая, что она работает нормально (не тестировалась):

// sequelizeBulkInsert.js
var fs = require('fs');
var async = require('async');
var csv = require('csv');module.exports = function(Model){
  this.importFile = function(filename, doneLoadingCallback) {
    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);
  }
}

Затем в другом файле

var Bulk = require('/path/to/sequelizeBulkInsert');
var bulk = new Bulk(Model);bulk.importFile('path_to_data.csv', function(){
  //data is imported
})
Olivier ответил: 12 мая 2018 в 03:38
Спасибо, эдуджр. я реализовал его и теперь получил ошибку, что модель не определена. Где определить, для какой модели sequelize нужно интерпретировать мои данные csv? Где-то в глубине?
Edudjr ответил: 13 мая 2018 в 05:34
Извините, я забыл об этом. Я обновил код, чтобы вы могли передать свою модель. Теперь модуль будет экспортировать функцию. Вам также может потребоваться изменить номер груза (в настоящее время 1000) в соответствии с вашими потребностями
Olivier ответил: 13 мая 2018 в 06:08
Отлично, спасибо, Эдуар, здесь уже поздно. :) Я попробую завтра утром в поезде выполнить мою работу, если я могу вызвать его из index.js в папке с образцами или, может быть, даже из файла js соответствующей модели ( мне просто нужно заполнить 3 таблицы из 8).
Olivier ответил: 16 мая 2018 в 11:41
Эй, Эдуар, большое спасибо. Теперь я могу заполнить свою БД данными, но она не заполняет в одной таблице внешние ключи. Возможно ли это, если вы создаете объемную копию?