Perl の代表的な ORマッパの一つ。CDBI とも呼ばれる。
1つのテーブルが 1つのクラスになる、ActiveRecord パターンに近い実装になっている。Class::DBI は Ima::DBI を用いてデータベースサーバとのコネクションの永続化も担当する。
CDBI の歴史は意外と古く、2001 年ころからすでに CPAN から利用できたモジュールである。最近では CDBI を参考にしつつ作られた新しい O/R マッパの DBIx::Class の人気が高まってきており移行するユーザーも多いようだ。
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%');