Class::DBI関連モジュール
いま作っている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つメモです。
Class::DBI::mysql
MySQL用で、テーブルのセットアップを簡単にしてくれるもの。
package Object; use base qw(Class::DBI::mysql); __PACKAGE__->set_up_table("table名");
これだけでOKになる。tableやcolumnsの設定がいらない。
Class::DBI::AbstractSearch
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を書くのが面倒なときに。
Class::DBI::Plugin::NoCache
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::Plugin::AbstractCount
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から始まる人の数が得られます。
Class::DBI::Plugin::RetrieveAll
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::Plugin::IteratorとClass::DBI::Pager
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なるものがあって、上の機能がけっこう実現されてそうな勢いです。
コメント
http://search.cpan.org/~lyokato/Class-DBI-Plugin-NoCache/
Class::DBI::Plugin::NoCacheをCPANにあげておきました。
投稿者: kato | 2005年08月27日 17:45
ありがとうございます。
さっそくリンク書き換えました。
投稿者: かぜぶろ | 2005年08月27日 21:51