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