SQL::Translator::Producer::Tengを書きました
https://metacpan.org/module/SQL::Translator::Producer::Teng
TengのSchemaは手で書くのがタルいので、Teng::Schema::DumperなりTeng::Schema::Loaderなりを使ってごにょったりしていたのですが、無理やりだし、自動生成すればいいよねとは思っていたので、書きました。
Kyoto.pmでも先日のYAPC::Asiaでも「SQL::Translator::Producer::Tengみたいなのがあればいいかもしれないけど特に不便を感じてないからやってない」とか言っていたのですが、書いてみたら案外サクッとかけたので、CPANizeした次第。
以下の様なSQLファイルがあったとして、
CREATE TABLE `user` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`gender` TINYINT NOT NULL,
`birthday` DATE NOT NULL
);
以下のようにやれば、SQLファイルからTeng用のSchemaを出力することができます。
use SQL::Translator;
my $trans = SQL::Translator->new( parser => 'MySQL', file => 'sql/mysql.sql' );
$trans->producer('Teng', package => 'MyApp::DB::Schema');
say $trans->translate;
#package MyApp::DB::Schema;
#use strict;
#use warnings;
#use DBI qw/:sql_types/;
#use Teng::Schema::Declare;
#
#table {
# name 'user';
# pk qw/id/;
# columns
# { name => 'id', type => SQL_BIGINT }, # BIGINT
# { name => 'name', type => SQL_VARCHAR }, # VARCHAR
# { name => 'gender', type => SQL_TINYINT }, # TINYINT
# { name => 'birthday', type => SQL_DATETIME }, # DATE
# ;
#};
#
#1;
DBIのsql_typesの定数の解決なんかもやってるところがオシャレポイントです。
SQL::Translatorが解釈可能なSQLを書くのもちょっとコツが必要だったりするので、DBIx::Schema::DSLとか使ってみるといいんじゃないでしょうか(というステマ)。
Teng::Schema::Loaderつかってた今のプロジェクトもブランチで置き換えてみたら全部テスト通ったので、乗り換えちゃおうかなーとか思ってる。