Skip to content

Logging the migrations in the SequelizeMeta table (This works) #16

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 98 additions & 71 deletions bin/runmigration.js
Original file line number Diff line number Diff line change
@@ -1,88 +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");
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: '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' }
{
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);

let migrationsDir = path.join(process.env.PWD, options['migrations-path'] || 'migrations'),
modelsDir = path.join(process.env.PWD, options['models-path'] || 'models');

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;

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);
});

console.log("Migrations to execute:");
migrationFiles.forEach((file) => {
console.log("\t"+file);
});

if (options.list)
process.exit(0);
const fromRevision = options.rev;
let fromPos = parseInt(options.pos, 10);
const stop = options.one;


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");

cb(err);
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 })

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is SELECT * FROM "SequelizeMeta" correctly?

i think it should be SELECT * FROM `SequelizeMeta`

.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);
}
);

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);
});