2016-04-03 3 views
1

Мне нужен сценарий npm для создания/настройки/etc. и, наконец, импортировать SQL-дамп. Все создание, настройка и т. Д. Все работает, однако я не могу заставить импорт работать. Данные никогда не вставлены. Вот что у меня есть (фигу вложенная обратного вызова, как они будут превращены в обещаниях):Импорт дампа SQL в среде Node

connection.query(`DROP DATABASE IF EXISTS ${config.database};`, err => { 
    connection.query(`CREATE DATABASE IF NOT EXISTS ${config.database};`, err => { 
    connection.query('use DATABASENAME', err => { 
     const sqlDumpPath = path.join(__dirname, 'sql-dump/sql-dump.sql'); 
     connection.query(`SOURCE ${sqlDumpPath}`, err => { 
     connection.end(err => resolve()); 
     }); 
    }) 
    }); 
}); 

Я также попытался следующие с Sequelize (ОРМ):

return new Promise(resolve => { 
    const sqlDumpPath = path.join(__dirname, 'sql-dump/sql-dump.sql'); 
    fs.readFile('./sql/dump.sql', 'utf-8', (err, data) => { 
    sequelize 
     .query(data) 
     .then(resolve) 
     .catch(console.error); 
    }); 
}); 

ответ

1

Вот как настроить мой начальный Sequelized импорт с использованием рамки migrations. Существует много здесь происходит, но в коротком I:

  1. найти последнюю SQL-дамп в папке кочевок
  2. читать файл, используя fs
  3. разделить текст на запросы
  4. проверки, если его действительный запрос, и если да применить некоторые очистки, что мои данные, необходимые (see related post)
  5. толчка массив полного запросов - я начинаю с убедившись, что база данных является чистым путем вызова this.down первых
  6. запустить все как обещание (как это было предложено here) с использованием mapSeries (неmap)

Использование sequelize-cli вы можете в оболочке создать миграцию, написав:

sequelize migration:create 

И вы будете автоматически введите файл, в который вы вводите код ниже. Для того, чтобы выполнить миграцию просто написать:

sequelize db:migrate 
"use strict"; 
const promise = require("bluebird"); 
const fs = require("fs"); 
const path = require("path"); 
const assert = require("assert"); 
const db = require("../api/models"); // To be able to run raw queries 
const debug = require("debug")("my_new_api"); 

// I needed this in order to get some encoding issues straight 
const Aring = new RegExp(String.fromCharCode(65533) + 
    "\\" + String.fromCharCode(46) + "{1,3}", "g"); 
const Auml = new RegExp(String.fromCharCode(65533) + 
    String.fromCharCode(44) + "{1,3}", "g"); 
const Ouml = new RegExp(String.fromCharCode(65533) + 
    String.fromCharCode(45) + "{1,3}", "g"); 

module.exports = { 
    up: function (queryInterface, Sequelize) { 
    // The following section allows me to have multiple sql-files and only use the last dump 
    var last_sql; 
    for (let fn of fs.readdirSync(__dirname)){ 
     if (fn.match(/\.sql$/)){ 
     fn = path.join(__dirname, fn); 
     var stats = fs.statSync(fn); 
     if (typeof last_sql === "undefined" || 
      last_sql.stats.mtime < stats.mtime){ 
      last_sql = { 
      filename: fn, 
      stats: stats 
      }; 
     } 
     } 
    } 
    assert(typeof last_sql !== "undefined", "Could not find any valid sql files in " + __dirname); 

    // Split file into queries 
    var queries = fs.readFileSync(last_sql.filename).toString().split(/;\n/); 

    var actions = [{ 
     query: "Running the down section", 
     exec: this.down 
    }]; // Clean database by calling the down first 

    for (let i in queries){ 
     // Skip empty queries and the character set information in the 40101 section 
     // as this would most likely require a multi-query set-up 
     if (queries[i].trim().length == 0 || 
      queries[i].match(new RegExp("/\\*!40101 .+ \\*/"))){ 
     continue; 
     } 

     // The manual fixing of encoding 
     let clean_query = queries[i] 
     .replace(Aring, "Å") 
     .replace(Ouml, "Ö") 
     .replace(Auml, "Ä"); 

     actions.push({ 
     query: clean_query.substring(0, 200), // We save a short section of the query only for debugging purposes 
     exec:() => db.sequelize.query(clean_query) 
     }); 
    } 

    // The Series is important as the order isn't retained with just map 
    return promise.mapSeries(actions, function(item) { 
     debug(item.query); 

     return item.exec(); 
    }, { concurrency: 1 }); 
    }, 

    down: function (queryInterface, Sequelize) { 
    var tables_2_drop = [ 
     "items", 
     "users", 
     "usertypes" 
    ]; 
    var actions = []; 
    for (let tbl of tables_2_drop){ 
     actions.push({ 
     // The created should be created_at 
     exec:() => db.sequelize.query("DROP TABLE IF EXISTS `" + tbl +"`") 
     }); 
    } 

    return promise.map(actions, function(item) { 
     return item.exec(); 
    }, { concurrency: 1 });/**/ 
    } 
}; 
Смежные вопросы