おそらくはそれさえも平凡な日々

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つかってた今のプロジェクトもブランチで置き換えてみたら全部テスト通ったので、乗り換えちゃおうかなーとか思ってる。

created at
last modified at

2013-09-30T23:59:59+0900

comments powered by Disqus