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 を使っている。
  • C::M::DBIC::Schema はベースとして DBIx::Class::Schema を使っている。
  • C::M::DBIC::Schema での作法は,
    1. MyApp::Schema::DBName という DBIC::Schema を継承したクラスを作る。
    2. MyApp::Schema::DBName::Table という DBIC を継承した DB テーブルクラスを作る。ここにスキーマを自力で書く。
    3. ひも付けとして MyApp::Model::DBName という C::M::DBIC を継承したクラスを作る。
    4. my $record = $c->model('DBName::TableName')->find(1); してウマー
  • 結局,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 になる。
    • ヘルパが MyApp::SchemaLoader 以下にその親を自動的に作ってくれる
    • これは CDBI::Loader のように実行時にスキーマをロードしてくれる。
    • つまり DBIC を継承したテーブルクラスを自力で作る必要がなくなる。

まとめると,

  • C::M::CDBICDBI::Loader とスキーマを実行時にロードしてくれる。ヘルパスクリプトがテーブルクラスも作ってくれるし楽ちん。
  • C::M::DBIC::Schema はヘルパとして
    • C::H::DBIC::SchemaLoader を使うと C::M::CDBI のようにスキーマを実行時にロードするアプローチになる。
    • C::H::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通りのやりかたがわかりやすくまとまっていておすすめ。