Catalystで使用テーブルを明示的に指定しない理由
CatalystでModelにMySQLを使用し、あれこれ試行錯誤していて思ったこと。
「Catalystってどうしてテーブルを明示的に指定しないんだ?」
多くのサンプルプログラムをあさってみるが、どのソースにもテーブル指定の記述は無い。
理由がわからなかったのでその疑問は放置していたのですが、こんなエラーメッセージを調べるうちにその理由がわかりました。
エラーメッセージ
Couldn't instantiate component "Anntena::Model::CDBI", "jpzipcode has no primary key at C:/Perl/site/lib/Class/DBI/Loader/Generic.pm line 164
CatalystのModel作成時に吐かれるエラー。よくわかりません。
Class::DBI::Loader::Generics.pmのドキュメントをあたってみる。
Class::DBI::Loader::Generics.pmとは
Class::DBI::Loader::Generic - Generic Class::DBI::Loader Implementation. - metacpan.org
どうやらこのモジュールは
「汎用のClass::DBI::Loader実装」そうです。
はてな?Class::DBI::Loaderを調べる。
Class::DBI::Loader - Dynamic definition of Class::DBI sub classes. - metacpan.org
このClass::DBI::Loader。
DESCRIPTIONを訳すとこんな感じでしょうか。
DESCRIPTION
Class::DBI::Loader automate the definition of Class::DBI sub-classes. scan table schemas and setup columns, primary key.
「Class::DBI::LoaderはClass::DBIサブクラスの定義を自動化します。表スキーマをスキャンし、列、そして主キーをセットアップします」
なるー。Class::DBI::Loaderは使用するデータベースから自動的に存在するテーブル情報を取得して、スムーズに利用できるようにするのですね。
ではClass::DBI::Loader::Generics.pmは、Class::DBI::Loaderがさまざまな状況でも利用できるように、汎用化したものだと。
疑問氷解
つまり、冒頭の
「Catalystってどうしてテーブルを明示的に指定しないんだ?」
という疑問に対しては、
「Class::DBI::Loader::Generics.pmによって、テーブル情報が自動取得されるので、明示的に指定する必要は無い」と答えることができる、と。
それにしてもこのClass::DBI::Loader、便利すね。