Class::DBI::Loader

ちょっと前からマニュアルを読みながらClass::DBIを使っていたんですけれど、このモジュールはpackage Some::Class;use base 'Class::DBI' (以下略)のコードさえも自動生成してしまおうという物みたいです。


こんなテーブルをtest.dbというファイルに作って適当にデータを入れます。

sqlite> create table CD (title text, price INTEGER);
sqlite> create table artist(first_name text, last_name text);

sqlite> insert into CD values("a album",300);
sqlite> insert into CD values("b album",1000);
sqlite> insert into artist values("abc","defg");
sqlite> insert into artist values("hij","klmn");

そしてPerl側のスクリプト

use Class::DBI::Loader;

my $loader = Class::DBI::Loader->new(
  dsn       => "dbi:SQLite:dbname=test.db",
  namespace => "Database",
);
my $cd = $loader->find_class("CD");	#Database::CD
my $artist = $loader->find_class("artist"); #Database::Artist
print "'a album' price :",$cd->retrieve(title=>"a album")->price;
print "\nabc lastname ",$artist->retrieve(first_name=>"abc")->last_name;

結果

'a album' price :300
abc lastname :defg

dsnの表記はDBIでお馴染みの表記方法です。
そしてnamespaceは、指定しておいた名前以下にクラスが自動生成されます。上記の例だとDatabase以下に生成されます。
そしてfind_classメソッドですが、引数に指定されたテーブルに対する新しいクラスを作成します。
CDを例にするとfind_class("CD")が呼ばれ、(内部で)DBにアクセスし、CDテーブルのスキーマを取り出して、それを元にクラスを自動生成し、その自動生成した先のクラス名が返されます。それ以下はClass::DBIのメソッドを使ってretrieveしたりinsertしたりupdateしたり煮たり焼いたり好きに調理しましょう。retrieveした結果が上記の通りです。


いやぁ、CPAN最高ですね、やっぱり。