Schemaファイルのメンテナンスについて #20
こんにちは。モバイルファクトリーのよしみ、こと、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!:)