SQL::Interp
SQL::Interp を最近使ったりします。ってのも生 DBI だと IN 文とか placeholder 化するの面倒だし。
と言う訳で下記サンプル。__END__ 以下に結果もつけといた。
#!/usr/bin/perl use strict; use warnings; use Data::Dump qw(dump); use Perl6::Say; use SQL::Interp qw(sql_interp); { my ($sql, @bind) = sql_interp 'INSERT INTO identifier', +{ resource_id => 'xri://=zigorou', canonical_id => 'xri://=!545A.6972.43FA.38AD' }; say dump($sql, \@bind); } { my ($sql, @bind) = sql_interp 'UPDATE identifier SET', +{ canonical_id => 'abcdefg' }, 'WHERE', +{ resource_id => 'http://zigorou.myopenid.com/', status => 1 }; say dump($sql, \@bind); } { my ($sql, @bind) = sql_interp 'SELECT resource_id, canonical_id FROM identifier WHERE resource_id IN', [qw|xri://=zigorou http://zigorou.myopenid.com/ http://profile.livedoor.com/zigorou_|]; say dump($sql, \@bind); } __END__ ( "INSERT INTO identifier (canonical_id, resource_id) VALUES(?, ?)", ["xri://=!545A.6972.43FA.38AD", "xri://=zigorou"], ) ( "UPDATE identifier SET canonical_id=? WHERE (resource_id=? AND status=?)", ["abcdefg", "http://zigorou.myopenid.com/", 1], ) ( "SELECT resource_id, canonical_id FROM identifier WHERE resource_id IN (?, ?, ?)", [ "xri://=zigorou", "http://zigorou.myopenid.com/", "http://profile.livedoor.com/zigorou_", ], )
ちなみに作者は CGI::Application の人。らしいっちゃらしい。
SQL の組み立てって色んなアプローチあるけど、しっくり来るのは無いなぁ。SQL::Abstract みたいなアプローチも良いとは思うけど、SQL の原型が生々しい方が使いやすいなんて事も環境*1によってはあるのかなぁと。
SQL::Interp がベターとも思わないけど。
詳しくは perldoc SQL::Interp して下さい。
*1:システム的にも人的にも