13/8/12追記:models("Schema")->deployment_statements
を使うともっと良い感じに出来ると id:soh335 に教えてもらったの忘れてた。
こういう感じのやつ作って
package MyApp::CLI::DB::DDL; use 5.10.1; use strict; use warnings; use utf8; use Mouse; use MyApp::Models; use SQL::Translator; use File::Basename qw(dirname); with "MyApp::Role::CLI"; no Mouse; sub run { local $| = 1; my $self = shift; my ($options, @args) = $self->parse_options(@_); my $file = File::Spec->catfile($options->{"file"} || "./sql/master.sql"); say "ddl file: $file"; my $output = models('Schema')->deployment_statements( undef, undef, undef, { no_comments => 1, add_drop_table => 1, } ); if (!$options->{"dry-run"}) { my $dirname = dirname($file); $self->mkpath($dirname) if !-e $dirname; $self->save_file($file, $output); } say "done"; } sub option_spec { my ($self) = @_; return( "dry-run", "file=s", ); } sub pass_through { 0 } 1;
それから、
#!/usr/bin/env perl use 5.10.1; use strict; use warnings; use utf8; use FindBin::libs; use MyApp::CLI::DB::DDL; my $ddl = MyApp::CLI::DB::DDL->new(); $ddl->run(@ARGV);
とか作る。
ついでに、SQLが最新じゃないとコケるテストを適当に書いておくとcreate_ddlし忘れるとかなくなって便利
use strict; use warnings; use utf8; use Test::More; use MyApp::CLI::DB::DDL; subtest "ddl、古くない?" => sub { my $cli = MyApp::CLI::DB::DDL->new; $cli->run("--file=./t/master.sql"); my $text = `diff -u ./sql/master.sql ./t/master.sql 2>&1`; ok !$text, $text; unlink "./t/master.sql"; }; done_testing;
MyApp::Role::CLIとかは、良しなに脳内補完してください。