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!:)