SQL::Translator を使って,DBIC からテーブル生成

反対に,DBIC スキーマクラスから SQL 文等を生成するには,

% sqlt -f DBIx-Class -t SQLite --DBIx::Schema MySchemaClass.pm

とやればよい…はずなのですが,sqlt コマンドがオプション等食ってくれないので,SQL::Translator クラスをごりごり触るしかいまのところなさそうです。

#!/usr/bin/perl
use strict;
use SQL::Translator;

my $t = SQL::Translator->new(
# debug       => 1,
  no_comments => 0,
  parser      => 'SQL::Translator::Parser::DBIx::Class',
  parser_args => {
                   package => 'MySchemaClass',
                 },
  producer    => 'SQLite',
);

my $output = $t->translate() or die $t->error;
print $output, "\n";

SQL::Translator::Parser::DBIx::Class は DBIx-Class ディストリビューションに含まれているのですがこの辺が今後どう変わるかわかりませんので,パーサのオプションとして DBIx::Schema ではなく*1 package というものにしておきました。

ということで,なんとか SQL::Translator を介して DBIC とデータベースのスキーマの相互変換ができるようになりました。が,ソースファイルとして YAML を用いて,そこから DBIC クラスファイルとテーブルスキーマを自動生成するようにするほうが安定している戦略かもしれません。あるいは DBDesigner 出力 XML の Parser を書くというのも面白そうですね。

*1:DBIx::Class::Manual::Cookbook では DBIx::Class となっていますが,古い説明だと思います。