SQL::Executor ってモジュールを書いてみた
僕は基本的には、SQL生派で、最近少しずつ Teng を試したりしています。
なので、DBI でも機能的には問題ない、と思っているのですが、テストコードやちょっとしたスクリプトだと、prepare して、execute して fetchrow はちょっとダルいなぁ、と思うわけです。で、DBI には selectrow_(arrayref|hashref) とか selectall_arrayref とかあるのですが、アレのパラメータはちょっと意味不明すぎるなぁ、とも思うわけです。
なので、SQL::Makerと DBI の select(row|all)* をいい感じにくっつけたら、いい感じになるんじゃないか、と思って書いてみました。*1 *2
使い方は SYNOPSYS に書いたとおりで、こんな感じです。(SYNOPSYS 丸写し)
use DBI; use SQL::Executor; my $dbh = DBI->connect($dsn, $id, $pass); my $ex = SQL::Executor->new($dbh); my @rows = $ex->select('SOME_TABLE', { id => 123 }); $ex->insert('SOME_TABLE', { id => 124, value => 'xxxx'} ); $ex->update('SOME_TABLE', { value => 'yyyy'}, { id => 124 } ); $ex->delete('SOME_TABLE', { id => 124 } );
select 系はいっぱいメソッドありますが、基本的に select_row* は1行だけ、select_all* は全行取るやつです。row も all もつかないやつは、コンテキストに応じて row か all かを決めます。
select(|all|row)_named は名前付きプレースホルダーが使えるやつ。*3
select(|all|row)_by_sql は、普通に SQL を投げるやつ(名前付きプレースホルダーじゃなくて、「?」を使うやつ)です。
select(|all|row)_with_fields は普通の select 系と同様に SQL::Maker を使うのですが、select * ではなく、出力フィールドを指定できます。
連休開けたら実案件に投入してみます。
ってか、みんなこういうのどうしてるんだろう?そもそも困ってないのか、律儀に DBI のインターフェース叩いてるのか、こういうラッパーを t::Util とかに置いてるのか、DBIx::Simple とか使ってるのか、うーむ、どうしてるんでしょうね。。。