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

全体の流れ

データベースの作成

スキーマ

ここでは以下のようなスキーマの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 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.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";
}

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

Last-modified: 2009-11-07 (土) 08:56:20 (2992d)