tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

SQL::Executor ってモジュールを書いてみた

僕は基本的には、SQL生派で、最近少しずつ Teng を試したりしています。

なので、DBI でも機能的には問題ない、と思っているのですが、テストコードやちょっとしたスクリプトだと、prepare して、execute して fetchrow はちょっとダルいなぁ、と思うわけです。で、DBI には selectrow_(arrayref|hashref) とか selectall_arrayref とかあるのですが、アレのパラメータはちょっと意味不明すぎるなぁ、とも思うわけです。

なので、SQL::MakerDBI の select(row|all)* をいい感じにくっつけたら、いい感じになるんじゃないか、と思って書いてみました。*1 *2

p5-SQL-Executor

使い方は 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 とか使ってるのか、うーむ、どうしてるんでしょうね。。。

*1:いや、嘘。仕事でそれっぽいのを一度書いたことがあるのですが、プロジェクト構造とかそういうのに依存しない形で切り離して一から実装しなおしてみました

*2:DBIx::Simple がコレの類似品に相当するのは一応知っているけど、使ったことないのと、SQL::Maker に慣れてるのでそれを使いたいってのと、SQL の部分だけなんとかするやつが欲しかった。

*3:Teng の search_named() のコードをぱくってます