Catalyst::Model::CDBI と Catalyst::Model::DBIC::Schema 雑感
Bundle::Catalyst の後継 Task::Catalyst では,CDBI 系ではなく,DBIC 系(DBIx::Class::Schema)がついてきます。それで,最近の DBIC ってどうなのよと思い,つらつらと調べてみました。CDBI 歴 0 日,DBIC 歴 1 日なので間違いが多いかもしれません。
- C::M::CDBI はベースとして Class::DBI を使っている。
- さらにその内部で Class::DBI::Loader を使っている。
- つまり,インスタンス作成時にスキーマを DB から取得している。
- C::M::DBIC::Schema はベースとして DBIx::Class::Schema を使っている。
- C::M::DBIC::Schema での作法は,
- 結局,C::M::DBIC::Schema ではテーブルクラスを定義するのがめんどくさい。
Model クラス生成ヘルパは MyApp::Model::DBName しか用意してくれない。create=static で自動生成してくれるようになりました。
- Model クラス生成時にヘルパとして C::H::DBIC::Schema ではなくC::H::DBIC::SchemaLoader を使うと,DB スキーマクラスの親が DBIC::Schema ではなく,DBIC::Schema::Loader になる。
まとめると,
- C::M::CDBI は CDBI::Loader とスキーマを実行時にロードしてくれる。ヘルパスクリプトがテーブルクラスも作ってくれるし楽ちん。
- C::M::DBIC::Schema はヘルパとして
スキーマをロードするというのは DB へメタデータを取得しにいくわけですから,決して軽い処理ではありません。script/myapp_server.pl のようにスタンドアロンで実行するサーバなら,サーバ起動時に一度だけスキーマロードが発生するのでよいのですが,mod_perl だと MaxRequestsPerChild を超えプロセスが再生成されるときにもスキーマロードが発生しますし,CGI として実行すると毎回ロードされますから論外です。DBIC::Schema のような自力でスキーマを定義するアプローチの方が,実環境で使うには向いている気がします。とりあえず DBIC::Schema::Loader を使って楽に開発するということもできますし。とはいえ Catalyst::Helper::Model::DBIC::Schema 自体はあまりに貧弱ですねぇ。
おまけ
C::M::DBIC::Schema が標準になるまえは,C::M::DBIC が標準でした。こちらは DBIC::Loader というやや deprecated なクラスを使っていたので,CDBI(::Loader)の感触に近いみたいです。ですが,SQLite でヘルパを試してみたところ,segmentation fault が起きてしまいました。
そういえば WEB+DB Press に naoya 氏が Catalyst の紹介を書いていたんですが,DBIC::Schema と DBIC::Schema::Loader のどちらを使っていたか忘れてしまいました。家においてきちゃったし。CDBI のほうを使っていました。 orz
追記 2006/06/22
typester さんの記事「2006/06/21 - memo - unknownplace.org」によると,DBIC::Schema のヘルパでもスキーマクラスを静的に自動生成することができるようになったみたいです。3通りのやりかたがわかりやすくまとまっていておすすめ。