Masteries

技術的なことや仕事に関することを書いていきます.

頼りがいのある(かもしれない)Database Migration Utility, Anegoを作っています

PerlでWebAppなどを作っている際, データベースのマイグレーションをするのであれば, 例えば@sugyanさんのブログに書かれているSQL::Translator::DiffでDBスキーマに追従させる方法のような手段を使ったり, 或いはこれと同じくSQL::Translator::Diffに基づいたGitDDLGitDDL::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ディレクトリにスキーマの情報が保存されていきます. diffmigrateをする際にバージョンとして指定することで, 現在のデータベースのスキーマと, 過去の任意のスキーマについて, 差分を表示したりマイグレーション(ロールバック)したりすることもできます.

$ ls .db
1458563116.sql
1458710980.sql

# 現在のデータベースのスキーマと, 1458563116.sqlにおけるスキーマの差分を表示する
$ daiku 'diff[1458563116]'

さっくり作った段階ですので, ご意見ご要望ご指摘などお待ちしております. よろしくお願い致します.