全体の流れデータベースの作成スキーマここでは以下のようなスキーマのDBをSQLiteで作る事にする。
シェルから作成実行以下のようにシェルからコマンドを実行し、DBを作成する。 cat > test.sql create table player ( player_id int primary key, player_name text, team_id int); create table team ( team_id int primary key, team_name text ); insert into player values ( 1 , 'a', 1); insert into player values ( 2 , 'b', 1); insert into player values ( 3 , 'c', 2); insert into player values ( 4 , 'd', 2); insert into player values ( 5 , 'e', 1); insert into team values ( 1, 'x'); insert into team values ( 2, 'y'); sqlite3 test.db < test.sql スキーマクラス・テーブルクラスの作成シェルから作成実行DBIx::Class::Schema::Loaderのmake_shema_atを使って、スキーマクラス・テーブルクラスを作成する。http://search.cpan.org/perldoc?DBIx::Class::Schema::Loader perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at "MyDB::Schema", {relationships => 1, debug => 1}, ["dbi:SQLite:test.db"]' 作成されたファイルの構成lib `-- MyDB |-- Schema | |-- Player.pm テーブルクラス DBIx::Class | `-- Team.pm テーブルクラス DBIx::Class `-- Schema.pm スキーマクラス DBIx::Class::Schema Schema.pmpackage MyDB::Schema; use base 'DBIx::Class::Schema'; __PACKAGE__->load_classes; Player.pmpackage MyDB::Schema::Player; use base 'DBIx::Class'; __PACKAGE__->load_components("Core"); __PACKAGE__->table("player"); __PACKAGE__->add_columns( "player_id", { data_type => "int", default_value => undef, is_nullable => 1, size => undef }, "player_name", { data_type => "text", default_value => undef, is_nullable => 1, size => undef, }, "team_id", { data_type => "", default_value => undef, is_nullable => 1, size => undef }, ); __PACKAGE__->set_primary_key("player_id"); テーブルジョイン出来るように以下の行をPlayer.pmに追加する。http://search.cpan.org/perldoc?DBIx::Class::Manual::Joining __PACKAGE__->belongs_to('team', 'MyDB::Schema::Team', 'team_id'); Team.pmpackage MyDB::Schema::Team; use base 'DBIx::Class'; __PACKAGE__->load_components("Core"); __PACKAGE__->table("team"); __PACKAGE__->add_columns( "team_id", { data_type => "int", default_value => undef, is_nullable => 1, size => undef }, "team_name", { data_type => "text", default_value => undef, is_nullable => 1, size => undef, }, ); __PACKAGE__->set_primary_key("team_id"); 注意スキーマクラスで、load_classes()ではなく、load_namespaces()を使う場合、MyDB/Schemaディレクトリ内にResultディレクトリを作成し、その中にPlayer.pmとTeam.pmを置く。現在はResultディレクトリを使う構成の方が推奨されているようだ。 詳しくは、http://search.cpan.org/perldoc?DBIx::Class::Schema 。 DB操作スクリプト例use lib './lib'; use MyDB::Schema; my $schema = MyDB::Schema->connect('dbi:SQLite:dbname=test.db', '', ''); my $rs = $schema->resultset('Player'); my @rows = $rs->all; foreach my $r (@rows) { print join(':', ($r->player_id,$r->player_name,$r->team->team_name)),"\n"; } |
|