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"
}
}対応するデータベースは
です。
便利ですね:)