node-db-migrate便利

データベースのIOがあるようなアプリケーションを開発しているとテーブル定義の履歴を管理するのが面倒になってきます。
Railsだとmigrationがあって非常に便利なので、Node.jsにも同じようなのないの?と思って探したらありました。

nearinfinity/node-db-migrate
rsandor/node-migrate
visionmedia/node-migrate

今回はnode-db-migrateを使います。
Windows XP, node: 0.6.17, npm: 1.1.21

npmでインスコ。なぜかmysqlもグローバルに入れないと動きませんでした。あうあうー。

npm install -g db-migrate mysql@2.0.0-alpha4

db-migrate createコマンドでマイグレーションファイルを作成できます。

db-migrate create add-pets
[INFO] Created migration at ./migrations/20121129020000-add-pets.js

マイグレーションファイルの中身はこんな感じ。
dbオブジェクトを操作してcreateTableしたりdropTableしたりします。

var dbm = require('db-migrate');
var type = dbm.dataType;
exports.up = function(db, callback) {

};
exports.down = function(db, callback) {

};

基本的に 関数(テーブル名, オプション, コールバック) の形式で書いていく。

// create table
exports.up = function (db, callback) {
  db.createTable('pets', {
    id: { type: 'int', primaryKey: true },
    name: 'string'
  }, callback);
};
// add column
db.addColumn('pets', 'type', {type: 'string', length: 45, defaultValue: null}, callback);
// delete column
db.removeColumn('pets', 'type', callback);
// change column
db.changeColumn('pets', 'name', {type: 'string', length: 45, defaultValue: null}, callback);
// insert
db.insert('pets', ['id', 'name'], [1, 'tama'], callback);
// drop table
db.dropTable('pets', callback);

asyncを使って複数の処理を順々に実行することもできます。

var async = require('async');

exports.up = function (db, callback) {
  async.series([
    db.createTable.bind(db, 'pets', {
      id: { type: 'int', primaryKey: true },
      name: 'string'
    }),
    db.createTable.bind(db, 'owners', {
      id: { type: 'int', primaryKey: true },
      name: 'string'
    });
  ], callback);
};

環境設定はJSONで管理することができます。
実行時に以下のように実行環境を指定できます。
db-migrate up -e production

{
  "dev": {
    "driver": "sqlite3",
    "filename": "~/dev.db"
  },

  "test": {
    "driver": "sqlite3",
    "filename": ":memory:"
  },

  "production": {
    "driver": "mysql",
    "user": "root",
    "password": "root"
  },

  "pg": {
    "driver": "pg",
    "user": "test",
    "password": "test",
    "host": "localhost",
    "database": "mydb"
  }
}

対応するデータベースは

です。

便利ですね:)