* 全体の流れ [#k203f830]

** データベースの作成 [#vad6e51f]
*** スキーマ [#gc8e50ce]
ここでは以下のようなスキーマのDBをSQLiteで作る事にする。
-テーブル player
-- player_id int (PK)
-- player_name text
-- team_id int (FK)
-テーブル team
-- team_id int (PK)
-- team_name text

*** シェルから作成実行 [#jf1c9d9e]
以下のようにシェルからコマンドを実行し、DBを作成する。
 cat > test.sql
 create table player ( player_id int primary key, player_name text, team_id );
 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

** スキーマクラス・テーブルクラスの作成 [#b658349a]
*** シェルから作成実行 [#xf4181d2]
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"]'

*** 作成されたファイルの構成 [#va03ff47]
 lib
 `-- MyDB
     |-- Schema
     |   |-- Player.pm テーブルクラス DBIx::Class
     |   `-- Team.pm   テーブルクラス DBIx::Class
     `-- Schema.pm     スキーマクラス DBIx::Class::Schema
*** Schema.pm [#a29ae65b]
 package MyDB::Schema;
 
 use base 'DBIx::Class::Schema';
 
 __PACKAGE__->load_classes;

*** Player.pm [#e4098674]

 package 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.pm [#j8f59a78]
 package 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");

*** 注意 [#p70892a0]
スキーマクラスで、load_classes()ではなく、load_namespaces()を使う場合、MyDB/Schemaディレクトリ内にResultディレクトリを作成し、その中にPlayer.pmとTeam.pmを置く。現在はResultディレクトリを使う構成の方が推奨されているようだ。

詳しくは、http://search.cpan.org/perldoc?DBIx::Class::Schema 。

** DB操作スクリプト例 [#r7c9ecc4]
 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";
 }

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS