SQL::Makerで動的に SQLを生成する
2010-12-13
どうもこんにちは。hacker track がやる気なさすぎるのでもう一回かくよ!というわけで tokuhirom ですこんにちは。こんにちは。
さて、最近つくった SQL::Maker というモジュールについて紹介します。SQL::Maker は、要は SQL::Abstract みたいなやつです。じゃあなんで SQL::Abstract じゃなくて SQL::Maker なの?ってことになるわけですが、 SQL::Abstract は実績があるし、非常に便利なんですが、いかんせんコードがまじよみづらいっていうかこれよむの無理じゃね!!ってことをおもうので、あたらしくつくったという次第。
また、SQL::Maker は method chain で SELECT 文を構築する機能もついてます。あらべんり。こんなかんじ↓↓
my $sql = SQL::Maker::Select−>new() −>add_select('foo') −>add_select('bar') −>add_select('baz') −>add_from('table_name') −>as_sql; # => "SELECT foo, bar, baz FROM table_name"
WHERE 句の生成とかを、すごいがんばって hashref/arrayref のくみわせで表現するのって、馬鹿馬鹿しくね?とおもうので、こんな風に、条件句同士を &や | でつなげられるようにしています。
my $condition = SQL::Maker::Condition−>new( name_sep => '.', quote_char => '`', ); $condition−>add('foo_id' => 3); $condition−>add('bar_id' => 4); $sql = $condition−>as_sql(); # (`foo_id`=?) AND (`bar_id`=?) @bind = $condition−>bind(); # (3, 4) # composite and my $other = SQL::Maker::Condition−>new( name_sep => '.', quote_char => '`', ); $other−>add('name' => 'john'); my $comp_and = $condition & $other; $sql = $comp_and−>as_sql(); # ((`foo_id`=?) AND (`bar_id`=?)) AND (`name`=?) @bind = $comp_and−>bind(); # (3, 4, 'john')
もちろんこんなかんじで、SQL::Abstract っぽくもつかえます。
my $builder = SQL::Maker−>new(); # SELECT ($sql, @binds) = $builder−>select($table, \@fields, \%where, \%opt); # INSERT ($sql, @binds) = $builder−>insert($table, \%values); # DELETE ($sql, @binds) = $builder−>delete($table, \%values); # UPDATE ($sql, @binds) = $builder−>update($table, \%set, \%where);
あと、plugin 機構もそなえています。SQL::Maker のプラギン機構は非常にシンプル。@EXPORT で定義されている関数が SQL::Maker にはえるだけ。わかりやすい。
package SQL::Maker::Plugin::InsertMulti; our @EXPORT = qw/insert_multi/; sub insert_multi { ... } 1;
とまあこんなかんじ。
拡張しやすいし、つかいやすいとおもう。つかってみてね!