Perlにてデータベースの差分が発生したときに簡単に差分を埋めるためのSQLを書くライブラリがあったので紹介。
ライブラリがない場合、cpan SQL::Translator でまずライブラリをCPANからインストールしましょう。
下記のソースを発行すればあるデータベースとあるデータベースを埋めるSQLを発行できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
use DBI; use SQL::Translator; use SQL::Translator::Diff; my $db_host = "sample_host"; my $db_user = "sample_user"; my $db_pass = "sample_pass"; my $from_db = "from_database"; my $to_db = "to_database"; print "Content-type: text/html\n\n"; #ここが起点となるデータベースのDBI my $from_dbh = DBI->connect("dbi:mysql:$from_db:$db_host", $db_user, $db_pass, { PrintError => 0, RaiseError => 1, AutoCommit => 0, mysql_enable_utf8 => 1, }); #これが目標となるデータベースのDBI my $dbh_to = DBI->connect("dbi:mysql:$to_db:$db_host", $db_user, $db_pass, { PrintError => 0, RaiseError => 1, AutoCommit => 0, mysql_enable_utf8 => 1, }); #print Util->vardump( $dbh ); my $from = SQL::Translator->new( parser => 'DBI', parser_args =>{ dbh => $from_dbh} )->translate(); my $to = SQL::Translator->new( parser => 'DBI', parser_args =>{ dbh => $dbh_to} )->translate(); #下記コマンドで差分のSQLを一気に発行できます。 my $diff = SQL::Translator::Diff->new({ output_db => 'MySQL', target_schema => $to , source_schema => $from })->compute_differences->produce_diff_sql; print $diff; |
参考リンク
SQL::Translator::DiffでDBスキーマに追従させる方法
なお、主にWEB+DBのvol91のP145-146を参考にしました。