PerlでWebAppなどを作っている際, データベースのマイグレーションをするのであれば, 例えば@sugyanさんのブログに書かれているSQL::Translator::DiffでDBスキーマに追従させる方法のような手段を使ったり, 或いはこれと同じくSQL::Translator::Diffに基づいたGitDDLやGitDDL::Migratorなどを使う手があると思います.
この辺りの方法を参考にしながら, Reactioなどでは独自のマイグレーションの仕組みを作って実践しているのですが, だいぶ安定して使えているし, そろそろ他のプロジェクトでも使いたくなってきたので, モジュールとして切り出してみることにしました.
なお名前は, Kansai.pmでAnegoのプロトタイプコードに様々なアドバイスを下さった@karupaneruraさんとそのORM「Aniki」に敬意を表して(?), 「Anego(姉御)」にしました.
使い方
AnegoはDBIx::Schema::DSLを使うようになっているので, まずはアプリケーションのスキーマをDBIx::Schema::DSLを使って記述します:
package MyApp::Schema; use strict; use warnings; use utf8; create_table 'user' => columns { integer 'id', primary_key, auto_increment; varchar 'name'; }; 1;
あとは, このように操作することができます:
use strict; use warnings; use utf8; use Anego; my $anego = Anego->new( connect_info => [ ... ], schema_class => 'MyApp::Schema', ); # スキーマのビルド $anego->build; # 最新のスキーマと現在のデータベースのスキーマとの差分を表示 $anego->diff; # 最新のスキーマへのマイグレーションの実行 $anego->migrate;
次のように, Daikufileなどと組み合わせるといいと思います:
namespace db => sub { require Anego; my $anego = Anego->new( connect_info => [...], schema_class => 'MyApp::Schema', ); task build => sub { $anego->build(); }; task diff => sub { $anego->diff($_[1]); }; task migrate => sub { $anego->migrate($_[1]); }; };
build
をすると, .db
ディレクトリにスキーマの情報が保存されていきます.
diff
やmigrate
をする際にバージョンとして指定することで, 現在のデータベースのスキーマと, 過去の任意のスキーマについて, 差分を表示したりマイグレーション(ロールバック)したりすることもできます.
$ ls .db 1458563116.sql 1458710980.sql # 現在のデータベースのスキーマと, 1458563116.sqlにおけるスキーマの差分を表示する $ daiku 'diff[1458563116]'
さっくり作った段階ですので, ご意見ご要望ご指摘などお待ちしております. よろしくお願い致します.