Umzug
The umzug lib is a framework agnostic migration tool for Node.JS. The tool itself is not specifically related to databases but basically provides a clean API for running and rolling back tasks.
Persistence
In order to keep track of already executed tasks, umzug logs successfully executed migrations. This is done in order to allow rollbacks of tasks. There are multiple storage presets available, from which you can choose. Adding a custom is super simple as well.
Storages
JSON
Using the json
storage will create a JSON file which will contain an array with all the executed migrations. You can specify the path to the file. The default for that is umzug.json
in the working directory of the process.
Options
{
path: process.cwd() + '/db/sequelize-meta.json'
}
Sequelize
Using the sequelize
storage will create a table in your database called SequelizeMeta
containing an entry for each executed migration. You will have to pass a configured instance of Sequelize or an existing Sequelize model. Optionally you can specify the model name, table name, or column name.
Options
{
sequelize: instance,
model: model,
modelName: 'Schema',
tableName: 'Schema',
columnName: 'migration'
}
Custom
In order to use a custom storage, you can create and publish a module which has to fulfill the following API. You can just pass the name of the module to the configuration and umzug will require it accordingly. The API that needs to be exposed looks like this:
var Bluebird = require('bluebird');
var redefine = require('redefine');
module.exports = redefine.Class({
constructor: function (options) {
this.options = options;
this.options.storageOptions = _.extend({
option1: 'defaultValue1'
}, this.options.storageOptions)
},
logMigration: function (migrationName) {
return new Bluebird(function (resolve, reject) {
});
},
unlogMigration: function (migrationName) {
return new Bluebird(function (resolve, reject) {
});
},
executed: function () {
return new Bluebird(function (resolve, reject) {
});
}
});
Migrations
Migrations are basically files that describe ways of executing and reverting tasks. In order to allow asynchronicity, tasks have return a Promise object which provides a then
method.
Format
A migration file ideally contains an up
and a down
method, which represent a function which achieves the task and a function that reverts a task. The file could look like this:
'use strict';
var Bluebird = require('bluebird');
module.exports = {
up: function () {
return new Bluebird(function (resolve, reject) {
});
},
down: function () {
return new Bluebird(function (resolve, reject) {
});
}
};
Usage
Installation
The umzug lib is available on npm:
npm install umzug
API
The basic usage of umzug is as simple as that:
var Umzug = require('umzug');
var umzug = new Umzug({});
umzug.someMethod().then(function (result) {
});
Executing migrations
The execute
method is a general purpose function that runs for every specified migrations the respective function.
umzug.execute({
migrations: ['some-id', 'some-other-id'],
method: 'up'
}).then(function (migrations) {
});
Getting all pending migrations
You can get a list of pending/not yet executed migrations like this:
umzug.pending().then(function (migrations) {
});
Getting all executed migrations
You can get a list of already executed migrations like this:
umzug.executed().then(function (migrations) {
});
Executing pending migrations
The up
method can be used to execute all pending migrations.
umzug.up().then(function (migrations) {
});
It is also possible to pass the name of a migration in order to just run the migrations from the current state to the passed migration name.
umzug.up({ to: '20141101203500-task' }).then(function (migrations) {});
Running specific migrations while ignoring the right order, can be done like this:
umzug.up({ migrations: ['20141101203500-task', '20141101203501-task-2'] });
There are also shorthand version of that:
umzug.up('20141101203500-task');
umzug.up(['20141101203500-task', '20141101203501-task-2']);
Running
Reverting executed migration
The down
method can be used to revert the last executed migration.
umzug.down().then(function (migration) {
});
It is possible to pass the name of a migration until which the migrations should be reverted. This allows the reverse of multiple migrations at once.
umzug.down({ to: '20141031080000-task' }).then(function (migrations) {
});
Reverting specific migrations while ignoring the right order, can be done like this:
umzug.down({ migrations: ['20141101203500-task', '20141101203501-task-2'] });
There are also shorthand version of that:
umzug.down('20141101203500-task');
umzug.down(['20141101203500-task', '20141101203501-task-2']);
Configuration
It is possible to configure umzug instance via passing an object to the constructor. The possible options are:
{
storage: 'json',
storageOptions: {},
upName: 'up',
downName: 'down',
migrations: {
params: [],
path: 'migrations',
pattern: /^\d+[\w-]+\.js$/,
wrap: function (fun) { return fun; }
}
}
License
MIT