スマートフォン用の表示で見る

Class::DBI

コンピュータ

Class::DBI

くらすでぃーびーあい

Perl の代表的な ORマッパの一つ。CDBI とも呼ばれる。

1つのテーブルが 1つのクラスになる、ActiveRecord パターンに近い実装になっている。Class::DBI は Ima::DBI を用いてデータベースサーバとのコネクションの永続化も担当する。

CDBI の歴史は意外と古く、2001 年ころからすでに CPAN から利用できたモジュールである。最近では CDBI を参考にしつつ作られた新しい O/R マッパの DBIx::Class の人気が高まってきており移行するユーザーも多いようだ。

SYNOPSIS

package Music::DBI;
use base 'Class::DBI';
Music::DBI->connection('dbi:mysql:dbname', 'username', 'password');

package Music::Artist;
use base 'Music::DBI';
Music::Artist->table('artist');
Music::Artist->columns(All => qw/artistid name/);
Music::Artist->has_many(cds => 'Music::CD');

package Music::CD;
use base 'Music::DBI';
Music::CD->table('cd');
Music::CD->columns(All => qw/cdid artist title year reldate/);
Music::CD->has_many(tracks => 'Music::Track');
Music::CD->has_a(artist => 'Music::Artist');
Music::CD->has_a(reldate => 'Time::Piece',
  inflate => sub { Time::Piece->strptime(shift, "%Y-%m-%d") },
  deflate => 'ymd',
);

Music::CD->might_have(liner_notes => LinerNotes => qw/notes/);

package Music::Track;
use base 'Music::DBI';
Music::Track->table('track');
Music::Track->columns(All => qw/trackid cd position title/); 

#-- Meanwhile, in a nearby piece of code! --#

my $artist = Music::Artist->insert({ artistid => 1, name => 'U2' });

my $cd = $artist->add_to_cds({ 
  cdid   => 1,
  title  => 'October',
  year   => 1980,
});

# Oops, got it wrong.
$cd->year(1981);
$cd->update;

# etc.

foreach my $track ($cd->tracks) {
  print $track->position, $track->title
}

$cd->delete; # also deletes the tracks

my $cd  = Music::CD->retrieve(1);
my @cds = Music::CD->retrieve_all;
my @cds = Music::CD->search(year => 1980);
my @cds = Music::CD->search_like(title => 'October%');