« Safari 3 Public Beta for Windowsを試してみた | Home | We Are The Night / Chemical Brothers »

[Perl]   DBICでdatetime型カラムの検索条件ではまった件

DBICでdatetime型のカラムを使うときはInflateColumn::DateTimeを使ってinflate/deflate時に自動的にDateTimeクラスから/に変換してくれてとっても便利ですが、それに慣れっこで検索条件にdatetime型を指定するときは要注意です。

とはいっても、sqlite限定の問題。


sqlite> select id, username, created_on from users;
1|user1|2007-06-14 00:00:00
...

とかいうデータがあったとして


my $dt = DateTime->new(
    year      => 2007,
    month     => 6,
    day       => 14,
    time_zone => 'local'
);
my $users = $schema->resultset('Users')
    ->search( { created_on => $dt} );

まぁ、当然といえば当然で


SELECT me.id, me.username, me.created_on FROM users me WHERE ( created_on = ? ): '2007-06-14T00:00:00'

とかSQLがはかれているので、sqliteではひっかりません。
やっかいなのはmysqlではdatetimeなフォーマットとして認識してくれて動いていたので、ちょっとはまりました。

直接formatterを指定してもいいのですが、ここはInflateColumn::DateTimeの挙動にあわせて


my $parser = $schema->storage->datetime_parser;
my $users = $schema->resultset('Users')
    ->search( { created_on => $parser->format_datetime($dt)} );

とかやればいいのかなぁと。

DBIx::Class::Storage::DBI
Defines (returns) the datetime parser class - currently hardwired to DateTime::Format::MySQL

ということなので、今のところsqliteではDateTime::Format::MySQLを使われてる感じです。

Trackbacks:

このエントリーのトラックバックURL:

Comments (1)

mqjkarrfuu6098uy

コメントを投稿