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する時につまづいてしまったので、またそれはまた別で書くことにする。


参考リンク