Schemaファイルのメンテナンスについて #20B!

こんにちは。モバイルファクトリーのよしみ、こと、id:walf443です。

20日目は、DBIx::SkinnyのSchemaファイルのメンテナンスについてです。

DBIx::Skinnyで共同開発してるときに、他の人がschemaが変わるような変更をあげたときに、手元のソースを最新にすると、

Schemaファイルは新しいのに、開発用のDBのSchemaが古いままということがままあります。

どこが変わったかは、コミットログを追えばだいたいはわかるんですが、ちゃんと直ったか確認するのはめんどうです。

ということでテストを書きましょう。

私はMySQLを使っているので、こんな感じでチェックするテストスクリプトを書いてます。

use strict;
use warnings;
use Proj::DB; # is a DBIx::Skinny.
use Data::Dumper;
use Test::More;
use YAML::XS;
use Text::Diff;

# SkinnyのSchemaとDBのSchemaの整合性をチェックするやつ

my $base = Proj::DB;
my $skinny_schema = $base->schema->schema_info;
my $skinny_table = {};
{
    for my $table ( sort keys %{ $skinny_schema } ) {
        $skinny_table->{$table} = [ sort @{ $skinny_schema->{$table}->{columns} } ];
    }
}

$base->connect;
my $dbh = $base->dbh;
my $db_table = {};
{
    for my $table ( $dbh->tables ) {
        # $table is like "table`.`column`".
        $table =~ s/^.+\.`(.+)`$/$1/;

        my $sth = $dbh->prepare(qq{ SHOW COLUMNS FROM $table });
        $sth->execute();
        my @columns;
        while ( my $row = $sth->fetchrow_hashref ) {
            push @columns, $row->{Field};
        }
        $db_table->{$table} = [ sort @columns ];
    }

}

for my $table ( keys %{ $skinny_schema }) {
    my $result = Text::Diff::diff(\YAML::XS::Dump($db_table->{$table}), \YAML::XS::Dump($skinny_table->{$table}) , {
        FILENAME_A => "db schema", FILENAME_B => "skinny schema",
    });
    ok(!$result, "$base schema $table table test" )
        or diag($result);
}

done_testing();

他には、DBIx::Skinny::Schema::Loaderというやつを使う方法もありますが、それはまた別の回があるそうです。

have a nice skinny days!:)