From 6192d650064c58f4f334b932dfaac8785bfb84ae Mon Sep 17 00:00:00 2001 From: Lenin Alevski Date: Sun, 31 Dec 2017 14:31:35 -0600 Subject: [PATCH 1/8] logging migrations on sequelizeMeta as thedeceptio suggested --- bin/runmigration.js | 55 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/bin/runmigration.js b/bin/runmigration.js index cc8c585..2e5ed80 100644 --- a/bin/runmigration.js +++ b/bin/runmigration.js @@ -7,20 +7,19 @@ const Async = require("async"); const migrate = require("../lib/migrate"); +let migrationsDir = path.join(process.env.PWD, 'migrations'), + modelsDir = path.join(process.env.PWD, 'models'); + const optionDefinitions = [ { name: 'rev', alias: 'r', type: Number, description: 'Set migration revision (default: 0)', defaultValue: 0 }, { name: 'pos', alias: 'p', type: Number, description: 'Run first migration at pos (default: 0)', defaultValue: 0 }, { name: 'one', type: Boolean, description: 'Do not run next migrations', defaultValue: false }, { name: 'list', alias: 'l', type: Boolean, description: 'Show migration file list (without execution)', defaultValue: false }, - { name: 'migrations-path', type: String, description: 'The path to the migrations folder' }, - { name: 'models-path', type: String, description: 'The path to the models folder' }, { name: 'help', type: Boolean, description: 'Show this message' } ]; const options = commandLineArgs(optionDefinitions); -let migrationsDir = path.join(process.env.PWD, options['migrations-path'] || 'migrations'), - modelsDir = path.join(process.env.PWD, options['models-path'] || 'models'); if (options.help) { @@ -41,6 +40,27 @@ let fromRevision = options.rev; let fromPos = parseInt(options.pos); let stop = options.one; +var tableName = 'SequelizeMeta' ; +var SequelizeMeta = sequelize.define(tableName, { + name: { + type: Sequelize.STRING, + allowNull: false, + unique: true, + primaryKey: true, + autoIncrement: false + } +}); + +sequelize.query("CREATE TABLE `SequelizeMeta` ( `name` varchar(255) NOT NULL, PRIMARY KEY (`name`), UNIQUE KEY `name` (`name`), UNIQUE KEY `SequelizeMeta_name_unique` (`name`) )"); + +var already_uploaded = []; +try { + sequelize.query("SELECT * FROM `SequelizeMeta`", { type: sequelize.QueryTypes.SELECT }) + .then(users => { + for(var key in users){ + already_uploaded[users[key].name] = true ; + } + let migrationFiles = fs.readdirSync(migrationsDir) // filter JS files .filter((file) => { @@ -58,9 +78,17 @@ let migrationFiles = fs.readdirSync(migrationsDir) .filter((file) => { let rev = parseInt( path.basename(file).split('-',2)[0]); return (rev >= fromRevision); - }); - -console.log("Migrations to execute:"); + //return false ; + }) + +.filter((file) => { + return already_uploaded[file] != true ; +}) ; +// remove all migations which have already been loaded + + + +console.log("Migrations to execute:"); migrationFiles.forEach((file) => { console.log("\t"+file); }); @@ -69,13 +97,17 @@ if (options.list) process.exit(0); -Async.eachSeries(migrationFiles, +Async.eachSeries(migrationFiles, function (file, cb) { console.log("Execute migration from file: "+file); migrate.executeMigration(queryInterface, path.join(migrationsDir, file), fromPos, (err) => { if (stop) return cb("Stopped"); - + if(!err){ + sequelize.query("INSERT INTO SequelizeMeta (name ) VALUES ( ? )", + { replacements: [file] }).spread((results, metadata) => { + }); + } cb(err); }); // set pos to 0 for next migration @@ -86,3 +118,8 @@ Async.eachSeries(migrationFiles, process.exit(0); } ); + +}); +} catch (e){ + console.log(e); +} From 33c9edf9bec8d33b88c89103fda36b3151b11d39 Mon Sep 17 00:00:00 2001 From: Lenin Alevski Date: Sun, 31 Dec 2017 14:55:22 -0600 Subject: [PATCH 2/8] fixing wrong query for creating sequelize_migration_meta_table --- bin/runmigration.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/runmigration.js b/bin/runmigration.js index 2e5ed80..7f0ab19 100644 --- a/bin/runmigration.js +++ b/bin/runmigration.js @@ -51,11 +51,11 @@ var SequelizeMeta = sequelize.define(tableName, { } }); -sequelize.query("CREATE TABLE `SequelizeMeta` ( `name` varchar(255) NOT NULL, PRIMARY KEY (`name`), UNIQUE KEY `name` (`name`), UNIQUE KEY `SequelizeMeta_name_unique` (`name`) )"); +sequelize.query("CREATE TABLE sequelize_meta (name varchar(255) NOT NULL PRIMARY KEY UNIQUE)"); var already_uploaded = []; try { - sequelize.query("SELECT * FROM `SequelizeMeta`", { type: sequelize.QueryTypes.SELECT }) + sequelize.query("SELECT * FROM SequelizeMeta", { type: sequelize.QueryTypes.SELECT }) .then(users => { for(var key in users){ already_uploaded[users[key].name] = true ; From 3ecbff9baaa2bd17f5f3c0679e6996422f6f8be1 Mon Sep 17 00:00:00 2001 From: Lenin Alevski Date: Sun, 31 Dec 2017 14:58:34 -0600 Subject: [PATCH 3/8] using right table name --- bin/runmigration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/runmigration.js b/bin/runmigration.js index 7f0ab19..f9444bb 100644 --- a/bin/runmigration.js +++ b/bin/runmigration.js @@ -51,7 +51,7 @@ var SequelizeMeta = sequelize.define(tableName, { } }); -sequelize.query("CREATE TABLE sequelize_meta (name varchar(255) NOT NULL PRIMARY KEY UNIQUE)"); +sequelize.query("CREATE TABLE SequelizeMeta (name varchar(255) NOT NULL PRIMARY KEY UNIQUE)"); var already_uploaded = []; try { From f06e2c4489d3ce4896c451cdf04db2275cdebe51 Mon Sep 17 00:00:00 2001 From: Lenin Alevski Date: Sun, 31 Dec 2017 15:01:24 -0600 Subject: [PATCH 4/8] using underscore syntax for table name --- bin/runmigration.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/runmigration.js b/bin/runmigration.js index f9444bb..cf67706 100644 --- a/bin/runmigration.js +++ b/bin/runmigration.js @@ -40,7 +40,7 @@ let fromRevision = options.rev; let fromPos = parseInt(options.pos); let stop = options.one; -var tableName = 'SequelizeMeta' ; +var tableName = 'sequelize_meta' ; var SequelizeMeta = sequelize.define(tableName, { name: { type: Sequelize.STRING, @@ -51,11 +51,11 @@ var SequelizeMeta = sequelize.define(tableName, { } }); -sequelize.query("CREATE TABLE SequelizeMeta (name varchar(255) NOT NULL PRIMARY KEY UNIQUE)"); +sequelize.query("CREATE TABLE sequelize_meta (name varchar(255) NOT NULL PRIMARY KEY UNIQUE)"); var already_uploaded = []; try { - sequelize.query("SELECT * FROM SequelizeMeta", { type: sequelize.QueryTypes.SELECT }) + sequelize.query("SELECT * FROM sequelize_meta", { type: sequelize.QueryTypes.SELECT }) .then(users => { for(var key in users){ already_uploaded[users[key].name] = true ; @@ -104,7 +104,7 @@ Async.eachSeries(migrationFiles, if (stop) return cb("Stopped"); if(!err){ - sequelize.query("INSERT INTO SequelizeMeta (name ) VALUES ( ? )", + sequelize.query("INSERT INTO sequelize_meta (name ) VALUES ( ? )", { replacements: [file] }).spread((results, metadata) => { }); } From b62505bfeaa4c4c2c76033387761c309b90e7fa0 Mon Sep 17 00:00:00 2001 From: Lenin Alevski Date: Sun, 31 Dec 2017 15:08:10 -0600 Subject: [PATCH 5/8] . --- bin/runmigration.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/runmigration.js b/bin/runmigration.js index cf67706..d1d9442 100644 --- a/bin/runmigration.js +++ b/bin/runmigration.js @@ -40,7 +40,7 @@ let fromRevision = options.rev; let fromPos = parseInt(options.pos); let stop = options.one; -var tableName = 'sequelize_meta' ; +var tableName = 'SequelizeMeta' ; var SequelizeMeta = sequelize.define(tableName, { name: { type: Sequelize.STRING, @@ -51,11 +51,11 @@ var SequelizeMeta = sequelize.define(tableName, { } }); -sequelize.query("CREATE TABLE sequelize_meta (name varchar(255) NOT NULL PRIMARY KEY UNIQUE)"); +sequelize.query("CREATE TABLE \"SequelizeMeta\" (name varchar(255) NOT NULL PRIMARY KEY UNIQUE)"); var already_uploaded = []; try { - sequelize.query("SELECT * FROM sequelize_meta", { type: sequelize.QueryTypes.SELECT }) + sequelize.query("SELECT * FROM \"SequelizeMeta\"", { type: sequelize.QueryTypes.SELECT }) .then(users => { for(var key in users){ already_uploaded[users[key].name] = true ; @@ -104,7 +104,7 @@ Async.eachSeries(migrationFiles, if (stop) return cb("Stopped"); if(!err){ - sequelize.query("INSERT INTO sequelize_meta (name ) VALUES ( ? )", + sequelize.query("INSERT INTO \"SequelizeMeta\" (name ) VALUES ( ? )", { replacements: [file] }).spread((results, metadata) => { }); } From 055c6537915bca28898baa6449b93845903a3fc5 Mon Sep 17 00:00:00 2001 From: Lenin Alevski Date: Sun, 31 Dec 2017 15:20:46 -0600 Subject: [PATCH 6/8] . --- bin/runmigration.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/runmigration.js b/bin/runmigration.js index d1d9442..819a21d 100644 --- a/bin/runmigration.js +++ b/bin/runmigration.js @@ -51,7 +51,10 @@ var SequelizeMeta = sequelize.define(tableName, { } }); -sequelize.query("CREATE TABLE \"SequelizeMeta\" (name varchar(255) NOT NULL PRIMARY KEY UNIQUE)"); +sequelize.query(" + CREATE TABLE \"SequelizeMeta\" (name character varying(255) NOT NULL); + ALTER TABLE ONLY \"SequelizeMeta\" ADD CONSTRAINT \"SequelizeMeta_pkey\" PRIMARY KEY (name); +"); var already_uploaded = []; try { From 6e7b1c02b961e5ab8582215a99118fee7f995fe0 Mon Sep 17 00:00:00 2001 From: Lenin Alevski Date: Sun, 31 Dec 2017 15:23:57 -0600 Subject: [PATCH 7/8] . --- bin/runmigration.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/runmigration.js b/bin/runmigration.js index 819a21d..be27ba4 100644 --- a/bin/runmigration.js +++ b/bin/runmigration.js @@ -51,14 +51,14 @@ var SequelizeMeta = sequelize.define(tableName, { } }); -sequelize.query(" - CREATE TABLE \"SequelizeMeta\" (name character varying(255) NOT NULL); - ALTER TABLE ONLY \"SequelizeMeta\" ADD CONSTRAINT \"SequelizeMeta_pkey\" PRIMARY KEY (name); -"); +sequelize.query(` + CREATE TABLE "SequelizeMeta" (name character varying(255) NOT NULL); + ALTER TABLE ONLY "SequelizeMeta" ADD CONSTRAINT "SequelizeMeta_pkey" PRIMARY KEY (name); +`); var already_uploaded = []; try { - sequelize.query("SELECT * FROM \"SequelizeMeta\"", { type: sequelize.QueryTypes.SELECT }) + sequelize.query(`SELECT * FROM "SequelizeMeta"`, { type: sequelize.QueryTypes.SELECT }) .then(users => { for(var key in users){ already_uploaded[users[key].name] = true ; @@ -107,7 +107,7 @@ Async.eachSeries(migrationFiles, if (stop) return cb("Stopped"); if(!err){ - sequelize.query("INSERT INTO \"SequelizeMeta\" (name ) VALUES ( ? )", + sequelize.query(`INSERT INTO "SequelizeMeta" (name ) VALUES ( ? )`, { replacements: [file] }).spread((results, metadata) => { }); } From 91acfdc6ee1239cd516bf9e588eba03753fc53d9 Mon Sep 17 00:00:00 2001 From: Lenin Alevski Date: Mon, 1 Jan 2018 14:25:59 -0600 Subject: [PATCH 8/8] fixing async code for creating sequelizeMeta table and record executed migration scripts, eslin fixes --- bin/runmigration.js | 207 +++++++++++++++++++++----------------------- 1 file changed, 97 insertions(+), 110 deletions(-) diff --git a/bin/runmigration.js b/bin/runmigration.js index be27ba4..095733b 100644 --- a/bin/runmigration.js +++ b/bin/runmigration.js @@ -1,128 +1,115 @@ #!/bin/node -const path = require("path"); -const commandLineArgs = require('command-line-args'); -const fs = require("fs"); -const Async = require("async"); +const path = require('path'); +const commandLineArgs = require('command-line-args'); +const fs = require('fs'); +const Async = require('async'); +const Sequelize = require('sequelize'); +const migrate = require('../lib/migrate'); -const migrate = require("../lib/migrate"); - -let migrationsDir = path.join(process.env.PWD, 'migrations'), - modelsDir = path.join(process.env.PWD, 'models'); +const migrationsDir = path.join(process.env.PWD, 'migrations'); +const modelsDir = path.join(process.env.PWD, 'models'); const optionDefinitions = [ - { name: 'rev', alias: 'r', type: Number, description: 'Set migration revision (default: 0)', defaultValue: 0 }, - { name: 'pos', alias: 'p', type: Number, description: 'Run first migration at pos (default: 0)', defaultValue: 0 }, - { name: 'one', type: Boolean, description: 'Do not run next migrations', defaultValue: false }, - { name: 'list', alias: 'l', type: Boolean, description: 'Show migration file list (without execution)', defaultValue: false }, - { name: 'help', type: Boolean, description: 'Show this message' } + { + name: 'rev', alias: 'r', type: Number, description: 'Set migration revision (default: 0)', defaultValue: 0, + }, + { + name: 'pos', alias: 'p', type: Number, description: 'Run first migration at pos (default: 0)', defaultValue: 0, + }, + { + name: 'one', type: Boolean, description: 'Do not run next migrations', defaultValue: false, + }, + { + name: 'list', alias: 'l', type: Boolean, description: 'Show migration file list (without execution)', defaultValue: false, + }, + { name: 'help', type: Boolean, description: 'Show this message' }, ]; const options = commandLineArgs(optionDefinitions); -if (options.help) -{ - console.log("Simple sequelize migration execution tool\n\nUsage:"); - optionDefinitions.forEach((option) => { - let alias = (option.alias) ? ` (-${option.alias})` : '\t'; - console.log(`\t --${option.name}${alias} \t${option.description}`); - }); - process.exit(0); +if (options.help) { + console.log('Simple sequelize migration execution tool\n\nUsage:'); + optionDefinitions.forEach((option) => { + const alias = (option.alias) ? ` (-${option.alias})` : '\t'; + console.log(`\t --${option.name}${alias} \t${option.description}`); + }); + process.exit(0); } -const Sequelize = require("sequelize"); -const sequelize = require(modelsDir).sequelize; +const { sequelize } = require(modelsDir); const queryInterface = sequelize.getQueryInterface(); // execute all migration from -let fromRevision = options.rev; -let fromPos = parseInt(options.pos); -let stop = options.one; - -var tableName = 'SequelizeMeta' ; -var SequelizeMeta = sequelize.define(tableName, { - name: { - type: Sequelize.STRING, - allowNull: false, - unique: true, - primaryKey: true, - autoIncrement: false - } -}); - -sequelize.query(` - CREATE TABLE "SequelizeMeta" (name character varying(255) NOT NULL); - ALTER TABLE ONLY "SequelizeMeta" ADD CONSTRAINT "SequelizeMeta_pkey" PRIMARY KEY (name); -`); - -var already_uploaded = []; -try { - sequelize.query(`SELECT * FROM "SequelizeMeta"`, { type: sequelize.QueryTypes.SELECT }) - .then(users => { - for(var key in users){ - already_uploaded[users[key].name] = true ; - } - -let migrationFiles = fs.readdirSync(migrationsDir) -// filter JS files - .filter((file) => { - return (file.indexOf('.') !== 0) && (file.slice(-3) === '.js'); - }) -// sort by revision - .sort( (a, b) => { - let revA = parseInt( path.basename(a).split('-',2)[0]), - revB = parseInt( path.basename(b).split('-',2)[0]); - if (revA < revB) return -1; - if (revA > revB) return 1; - return 0; - }) -// remove all migrations before fromRevision - .filter((file) => { - let rev = parseInt( path.basename(file).split('-',2)[0]); - return (rev >= fromRevision); - //return false ; - }) - -.filter((file) => { - return already_uploaded[file] != true ; -}) ; -// remove all migations which have already been loaded - - - -console.log("Migrations to execute:"); -migrationFiles.forEach((file) => { - console.log("\t"+file); -}); - -if (options.list) - process.exit(0); - - -Async.eachSeries(migrationFiles, - function (file, cb) { - console.log("Execute migration from file: "+file); - migrate.executeMigration(queryInterface, path.join(migrationsDir, file), fromPos, (err) => { - if (stop) - return cb("Stopped"); - if(!err){ - sequelize.query(`INSERT INTO "SequelizeMeta" (name ) VALUES ( ? )`, - { replacements: [file] }).spread((results, metadata) => { - }); - } - cb(err); +const fromRevision = options.rev; +let fromPos = parseInt(options.pos, 10); +const stop = options.one; + +queryInterface.createTable('SequelizeMeta', { + name: { + type: Sequelize.STRING, + allowNull: false, + unique: true, + primaryKey: true, + }, +}).then(() => { + const alreadyExecuted = []; + try { + sequelize.query('SELECT * FROM "SequelizeMeta"', { type: sequelize.QueryTypes.SELECT }) + .then((scripts) => { + (scripts || []).forEach((script) => { + alreadyExecuted[script.name] = true; + }); + const migrationFiles = fs.readdirSync(migrationsDir) + .filter(file => (file.indexOf('.') !== 0) && (file.slice(-3) === '.js')) + .sort((a, b) => { + const revA = parseInt(path.basename(a).split('-', 2)[0], 10); + const revB = parseInt(path.basename(b).split('-', 2)[0], 10); + if (revA < revB) return -1; + if (revA > revB) return 1; + return 0; + }) + .filter((file) => { + const rev = parseInt(path.basename(file).split('-', 2)[0], 10); + return (rev >= fromRevision); + }) + .filter(file => alreadyExecuted[file] !== true); + console.log('Migrations to execute:'); + migrationFiles.forEach((file) => { + console.log(`\t${file}`); }); - // set pos to 0 for next migration - fromPos = 0; - }, - function(err) { - console.log(err); - process.exit(0); - } -); -}); -} catch (e){ + if (options.list) { process.exit(0); } + Async.eachSeries( + migrationFiles, (file, cb) => { + console.log(`Execute migration from file: ${file}`); + migrate.executeMigration( + queryInterface, path.join(migrationsDir, file), fromPos, + (err) => { + if (stop) { return cb('Stopped'); } + if (!err) { + return queryInterface.bulkInsert('SequelizeMeta', [{ + name: file, + }]).then(() => cb()).catch(error => cb(error)); + } + return cb(err); + }, + ); + // set pos to 0 for next migration + fromPos = 0; + }, + (err) => { + if (err) { + console.log(err); + } + process.exit(0); + }, + ); + }).catch(error => console.log(error)); + } catch (e) { console.log(e); -} + } +}).catch((error) => { + console.log(error); +});