いま作っているWebアプリで、Class:DBIをはじめてきちんと使った。
いろいろとPluginを使ったのでメモ。
ベースクラスには、
package Object;
use strict;
use base qw(Class::DBI::mysql);
use Class::DBI::AbstractSearch;
use Class::DBI::Plugin::NoCache;
use Class::DBI::Plugin::AbstractCount;
use Class::DBI::Plugin::RetrieveAll;
use Class::DBI::Plugin::Iterator qw(prefetch=>10);
use Class::DBI::Pager;
__PACKAGE__->nocache(1);
__PACKAGE__->connection(...);
こんな感じでプラグインの読み込みがたくさん。精神的によくない数です
1つ1つメモです。
MySQL用で、テーブルのセットアップを簡単にしてくれるもの。
package Object;
use base qw(Class::DBI::mysql);
__PACKAGE__->set_up_table("table名");
これだけでOKになる。tableやcolumnsの設定がいらない。
SQL::Abstractを利用した検索をするsearch_whereを追加してくれるプラグイン
package Object;
use base qw(Class::DBI::mysql);
use Class::DBI::AbstractSearch;
__PACKAGE__->set_up_table("table");
package main;
my @ret = Object-> search_where({
id=>?@list,
name=>{'like'=>'a%'}
})
とすることで、
select * from table where ((id=? or id=? or ..) and name like ?)
などのクエリーが発行される。set_sqlを書くのが面倒なときに。
CPANにはあがってないモジュールです。CPANにあがりました。Class-DBI-0.96の自動キャッシュの問題を解決してくれるもの。_initで
$Class::DBI::Weaken_Is_Available=0;
をしています。
package Object;
use base qw(Class::DBI::mysql);
use Class::DBI::Plugin::NoCache;
__PACKAGE__->nocache(1);
としておくとグー。
Class::DBI::AbstractSearchと同じくSQL::Abstractを利用したcountをするメソッドを追加。
package Object;
use base qw(Class::DBI::mysql);
use Class::DBI::Plugin::AbstractCount;
__PACKAGE__->set_up_table("table");
package main;
my $count = Object->count_search_where({
name=>{'like'=>'a%'}
});
aから始まる人の数が得られます。
retrieve_allにsortをくっつける、retrieve_all_sorted_byメソッドを追加するんだけど、それよりretrieve_all時のsortのデフォルト設定ができるretrieve_all_sort_fieldが便利
package Object;
use base qw(Class::DBI::mysql);
use Class::DBI::Plugin::AbstractCount;
__PACKAGE__->set_up_table("table");
__PACKAGE__->retrieve_all_sort_field('birthday desc');
package main;
my $count = Object->retrieve_all()
常に誕生日順でソートされたイテレータが返ります。というか最初からretrieve_all({order_by=>"birthday"})をサポートしてほしいところ
Class::DBI::Pagerはページングを行うプラグイン
package Object;
use base qw(Class::DBI::mysql);
use Class::DBI::Pager;
__PACKAGE__->set_up_table("table");
package main;
my $pager = Object->pager(20,1);#(1ページの個数,ページ)
my @page1 = $pager-> retrieve_all
ページングが簡単に行えます。
ただこのPagerを使った場合でもretrieve_all時には、全てのデータを取得してしまってます。
そこで、Class::DBI::Plugin::Iteratorの登場
package Object;
use base qw(Class::DBI::mysql);
use Class::DBI::Plugin::Iterator qw(prefetch=>10);
use Class::DBI::Pager;
__PACKAGE__->set_up_table("table");
とすることで、pagerやnext時に適当なlimit offsetをSQLにいれて実行してくれます。
たくさんのデータがある場合には速度向上が見込めそうです。
ここまで書いてきたけど、Class::DBI::Sweetなるものがあって、上の機能がけっこう実現されてそうな勢いです。