DBIx::Customが生SQL感覚でも使えてお気に入りなのだけれど、ちょっこしハマったのでメモ。
DBIx::Custom – search.cpan.org
MySQL(に限らないと思う)でwhereに関数を利用したい時は多々あると思います。
例えば、更新時刻を見て7日以上古ければ選択しないという条件をwhereに指定したい時、
CREATE TABLE `table` ( `name` VARCHAR( 5 ) , `update_time` TIMESTAMP ) SELECT * FROM `table` WHERE update_time > SUBDATE(NOW(), INTERVAL 7 DAY);
このようなSQLだとします。
行の選択 select / DBIx::Custom リファレンス – サンプルコードによるPerl入門によれば、where句の設定は、
と、ハッシュリファレンスで渡すことになっています。
= 以外での比較は DBIx::Custom::Whereオブジェクト を作成して渡すことになっているのですが、ハッシュリファレンスで SUBDATE(NOW(), interval 7 day) を渡すとうまくいかないので悩んでいました。
append => ” で文字列を追加できるので、無理やり実装してみたのですが作者にツイートしてみたところ、
がーん、そうなのか。恥ずかしい。。さらに、
がーん、DBIx::Custom::Where でも文字列が指定できたのか。。。(恥恥
という事で、
use DBIx::Custom; my $dbi = DBIx::Custom->connect( ........... 端折ります ); my $result = $dbi->select( table => 'table', where => 'create_time > SUBDATE(NOW(), interval 7 day)', );
あるいは、
use DBIx::Custom; my $where = $dbi->where; $where->clause([ 'and', 'create_time > SUBDATE(NOW(), interval 7 day)' ]); my $result = $dbi->select( table => 'table', where => $where, );
で、出来るって事なんですね。(ソース嫁!)
id:perlcodesampleさんありがとうございました!
DBIx::Customいいよー。
ところで
SYNOPSYSにあるinsertとかupdateとかが失敗するのはボクの日頃の行いが悪いせいでしょうか?
# Insert $dbi->insert({title => 'Perl', author => 'Ken'}, table => 'book'); # Update $dbi->update({title => 'Perl', author => 'Ken'}, table => 'book', where => {id => 5});
# Insert $dbi->insert( param => {title => 'Perl', author => 'Ken'}, table => 'book' ); # Update $dbi->update( param => {title => 'Perl', author => 'Ken'}, table => 'book', where => {id => 5} );
だと性交いや、成功するのですが。
param が必要??(だからソース嫁!)
追記:DBIx::Customのバージョンが 0.168 だったからのようです…APIが追加された模様。
カテゴリー: MySQL, perlモジュール - Trackback Uri



