- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Perl-DBIC/環境設定/全体の流れ へ行く。
- 1 (2007-03-29 (木) 11:59:13)
- 2 (2009-05-02 (土) 04:57:02)
- 3 (2009-09-06 (日) 05:10:59)
全体の流れ
データベースの作成
スキーマ
ここでは以下のようなスキーマのDBをSQLiteで作る事にする。
- テーブル player
- player_id int (PK)
- player_name text
- team_id int (FK)
- テーブル team
- team_id int (PK)
- team_name text
シェルから作成実行
以下のようにシェルからコマンドを実行し、DBを作成する。
cat > test.sql create table player ( player_id int primary key, player_name text, team_id ); 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.pm
package MyDB::Schema; use base 'DBIx::Class::Schema'; __PACKAGE__->load_classes;
Player.pm
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
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");
注意
スキーマクラスで、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";
}