パルカワ2

PerlとRubyとイチャラブ

DBIx::Class + GitDDLでなんかそれっぽいSQL出す。

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とかは、良しなに脳内補完してください。