2006-03-08

Class::DBIのsearchなどで発行されるSQLを確認するTips

 Class::DBIを使ってるときに「どんなSQLを発行してるんじゃろ?」と思うことはありませんか? 僕はあります*1

 なんかいい方法がないかなー、と思ってたんですが、Class::DBI::Plugin::Iteratorを使っていれば

  my $itr = CD->search( .... );
  print $itr->sql, "\n";
  print join ',', @{$itr->args}, "\n";

SQLの中身が確認できることを発見*2プレースホルダの部分は?になってるけど、その引数も確認できる*3

 どーせならEXPLAINの結果が確認できるとより便利な気もしますな。

Class::DBI::Sweetで集約関数が扱えるようになってた(←わけじゃなかった)

 普段はClass::DBIを使ってるわけですが、集約関数は扱えないんですね。

 直接SQLを書けばいいんですけど。なんとなくダサくてやだなーと思ってたら、Class::DBI::Sweetで扱えるようになってるじゃないですか。前にドキュメントを読んだ時はそんな記述はなかったのに~。

 というわけでやりたいことができるのか調査中なのですが、ハマった部分があったのでメモ。

 Class::DBI::Sweetのバージョン0.08だけの問題かもしれないけれど、SQL::Abstractのバージョンが1.20じゃないとテストが通りません*4

 あと0.07からClass::DBIのバージョンが3.0.12以降必須になってるっぽいですが*5、集約関数の対応は0.06からなので、そっちを使ったほうがいいかもと思いつつ(古いバージョンのClass::DBIが入っているサーバがいくつかあるから)テストしてません。

追記

 別に集約関数のための機能が増えてるわけじゃなかった。。。。

 やっぱ地道にSQL書いていくしかないのね。

さらに追記

 んでも、Class::DBI::Sweetを使えば割とよさげに処理できるのは間違いないっぽい。

 JOINの処理とかはかなりいい感じになるのですね。

 set_sqlにうまくSQLを書けばいいのかもしれない(駄目かもしれないけど)。

*1:より積極的にはEXPLAINの結果が見たいわけですが。

*2:素で忘れてた。

*3:$itr->argsの戻り値が常にARRAY_REFなのはださい気もするけど。

*4:t/08pager.tで失敗する。たぶん検索の書式の問題なので、分かっていればforce installしても大丈夫な気はする。

*5:バージョン文字列つかってるせいかなんかワーニング出てた気がする。