DBIx::Class::SchemaとDBIx::Class::Schema::Loader
DBIx::Class::SchemaとDBIx::Class::Schema::Loader両方を試してみた。
DBIx::Classは、SQL文を書かずにresultset()を使ってゴニョゴニョできるのがすばらしい!!
今回登場するファイルの場所はこんな感じ。
/root | |---Schema.pm # DBIx::Class::Schema |---SchemaLoader.pm # DBIx::Class::Schema::Loader | |---Schema/ | |---Member.pm # DBIx::Class::Schemaのload_classes(); | |---test_SchemaMember.pl #実行してみるファイル *db file = /path/to/hoge.db (DBI:SQLite)
テーブル作成用 members.sql
DROP TABLE IF EXISTS "members"; CREATE TABLE "members" ( "member_id" INTEGER PRIMARY KEY , "member_name" VARCHAR(255) NOT NULL DEFAULT '' ); INSERT INTO "members" VALUES(1,'テスト'); INSERT INTO "members" VALUES(2,'テスト2'); INSERT INTO "members" VALUES(3,'テスト3');
Schemaを手動で設定する場合
DBIx::Class用のSchemaベースクラスを作成
Schema.pm
package Schema; use strict; use warnings; use base qw/DBIx::Class::Schema/; #読み込むクラスを指定 __PACKAGE__->load_classes(qw/Members/); 1;
Members用のSchemaクラスを作成
Schema::Members.pm
package Schema::Members; use strict; use warnings; use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/PK::Auto Core/); __PACKAGE__->table('members'); __PACKAGE__->add_columns( "member_id", { data_type => "INTEGER", is_nullable => 0, size => undef }, "member_name", { data_type => "VARCHAR", is_nullable => 0, size => 255 }, ); __PACKAGE__->set_primary_key(qw/member_id/); 1;
Schemaを自動で設定する場合
SchemaLoader.pm
package SchemaLoader; use strict; use warnings; use base qw/DBIx::Class::Schema::Loader/; __PACKAGE__->loader_options( dsn => 'dbi:SQLite:dbname=/path/to/hoge.db', components => [qw( InflateColumn::DateTime AsFdat UTF8Columns )], relationships => 1, options => { AutoCommit => 1 }, debug => 1 ); 1;
SchemaLoader.pmを利用したtest_SchemaMember.pl
#!/usr/bin/perl use strict; use warnings; use SchemaLoader; #SchemaLoaderをSchemaにしても動く # スキーマクラスのインスタンスを作成 my $schema = SchemaLoader->connect('dbi:SQLite:dbname=/path/to/hoge.db'); #select my $rs = $schema->resultset('Members') ->search({ member_name => 'テスト' }); #insert $schema->resultset('Members')->create({ member_name => '氏名'});
デバッグ方法
export DBIC_TRACE=1
SQL文とバインドされる値が出力されます。
source: http://e8y.net/mag/011-dbix-class/
joinしたりrelationの設定などはこちらのページを読むか、ブログがわかりやすいです。
テーブルをjoinする時につまづいてしまったので、またそれはまた別で書くことにする。
- リレーションの理解しやすい図が素敵です
- JOINについて(英語)
- Relationshipについて(英語)
参考リンク