« CGI::Applicationでpost_dispatch | メイン | 「よつばと!」4巻 »

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::IteratorClass::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なるものがあって、上の機能がけっこう実現されてそうな勢いです。

トラックバック

この一覧は、次のエントリーを参照しています: Class::DBI関連モジュール:

» User/今井貴之/SQL from 扶桑ゴムWiki (PukiWiki/TrackBack 0.4)
Class::DBI CPAN perldoc.jp blog.nomadscafe.jp:Class::DBI関連モジュール 抽象化されたデータベ... [詳しくはこちら]

コメント

http://search.cpan.org/~lyokato/Class-DBI-Plugin-NoCache/

Class::DBI::Plugin::NoCacheをCPANにあげておきました。

ありがとうございます。
さっそくリンク書き換えました。

コメントを投稿