Abstract migration framework for node, support javascript and any js preprocessor
This project is based on TJ's node-migrate.
The main difference:
- js preprocessor support (using
--compiler <ext>:<module>
flag) - env flag
- migrate.opts default flag setting
- timestamp instead of sequnece number in file name when creating migrate file
$ npm install migration
Usage: migrate [options] [command]
Options:
-c, --chdir <path> change the working directory
-e, --env set NODE_ENV, default is development
--compiler <ext>:<module> use the given module to create or compile files
Commands:
down [name] migrate down till given migration
up [name] migrate up till given migration (the default command)
create [title] create a new migration file with optional [title]
To create a migration, execute migrate create
with an optional title. node-migrate
will create a node module within ./migrations/
which contains the following two exports:
exports.up = function(next){
next();
};
exports.down = function(next){
next();
};
All you have to do is populate these, invoking next()
when complete, and you are ready to migrate!
For example:
$ migrate create add-pets
$ migrate create add-owners
The first call creates ./migrations/20130601000000000-add-pets.js
, which we can populate:
var db = require('./db');
exports.up = function(next){
db.rpush('pets', 'tobi');
db.rpush('pets', 'loki');
db.rpush('pets', 'jane', next);
};
exports.down = function(next){
db.rpop('pets');
db.rpop('pets', next);
};
The second creates ./migrations/20130601000001000-add-owners.js
, which we can populate:
var db = require('./db');
exports.up = function(next){
db.rpush('owners', 'taylor');
db.rpush('owners', 'tj', next);
};
exports.down = function(next){
db.rpop('owners');
db.rpop('owners', next);
};
When first running the migrations, all will be executed in sequence.
$ migrate
up : migrations/20130601000000000-add-pets.js
up : migrations/20130602000000000-add-jane.js
migration : complete
Subsequent attempts will simply output "complete", as they have already been executed in this machine. node-migrate
knows this because it stores the current state in ./migrations/.migrate
which is typically a file that SCMs like GIT should ignore.
$ migrate
migration : complete
If we were to create another migration using migrate create
, and then execute migrations again, we would execute only those not previously executed:
$ migrate
up : migrates/20130603000000000-coolest-owner.js
You can also run migrations incrementally by specifying a migration.
$ migrate up 20130605000000000-coolest-pet.js
up : migrations/20130604000000000-add-pets.js
up : migrations/20130605000000000-coolest-pet.js
migration : complete
This will run up-migrations upto (and including) 002-coolest-pet.js
. Similarly you can run down-migrations upto (and including) a specific migration, instead of migrating all the way down.
$ migrate down 20130601000000000-add-jane.js
down : migrations/20130602000000000-add-owners.js
down : migrations/20130601000000000-add-jane.js
migration : complete
Copyright (c) 2013 Jarvis Ao Ieong
Licensed under the MIT license.