データのページングについて #19B!

こんにちわ!nekokakです!

十九日目はデータのページングについてです。

webの開発をしていると一度に大量のデータを表示させるのではなく、

10件ずつデータを表示させ、画面には次のデータへアクセスするためのリンクを用意する

いわゆるページングの処理を入れることが良くあります。

例えば、DBICを使っている場合は、

my $itr = $rs->search(...);
my $pager = $itr->pager;

のように、DBIC側でData::Pageのオブジェクトを生成して、

データのページングをしやすいように提供してくれます。

DBICで開発している方は良く使われていることでしょう。

ただ、DBIx::Skinnyではこのような機能を提供していません。

理由としては、Data::Pageのオブジェクトを作成する為には、

検索対象となるデータが全部で何件存在するかを知る必要があるからです。

DBICの場合は、pagerメソッドを呼び出すと内部でcountクエリを発行し、

検索対象の全体件数を取得しています。

しかし、DBIx::Skinnyはsearch_by_sqlのように生のSQLを自分で書く事を前提としたORMなので

利用者が書いた任意のSQLを解析して同じ条件のcountクエリを発行することは

とても難しいことです。

なので、実装していません。

また、個人的にはDBICが内部で勝手にcountクエリを発行するのは嫌です。

というのも、あまり意識せずに使っていると想定しているよりも多くSQLが実行されてしまい

パフォーマンスに影響が出てくることが多いからです。

普段DBICを使って開発されている方は、DBICのクエリログ機能を使って、

発行しているSQLを一度全部見てみることをおすすめします。

もしかすると、想定異常にcountメソッドを発行しているかもしれませんよ。

(最近のDBICでは改善されているかもしれませんが)

じゃぁDBIx::Skinnyでデータのページングはどうすんだよ!

って思う人もいるとおもいますが、

http://d.hatena.ne.jp/nekokak/20090924/1253761408

こちらに以前まとめた記事があるので、参考にしてみてください。

今日はここまで。

明日はid:walf443先生が書いてくれます。

お楽しみに。

have a nice skinny days!:)