DBIx::Customでデータベースの関数(MySQLのADDDATE()とかSUBDATE()とか)を使う
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句の設定は、
where => {title => 'Perl', author => 'Ken'}
と、ハッシュリファレンスで渡すことになっています。
= 以外での比較は 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が追加された模様。
-
前の記事
smtpサーバが迷惑メールサーバと思われないようにする 2011.06.30
-
次の記事
perlモジュールのバージョンを調べる便利なコマンド pmvers 2011.07.29