h1. DBIx::Class
h2. トレース
DBIx::Classで複雑なクエリを行っている場合、実際に発行されているクエリをみる必要がある場合があります。そのような場合は環境変数DBIC_TRACEを設定してスクリプトを実行すると実行されているクエリをみることができます:
<pre lang="Bash">
DBIC_TRACE=1 myscript.pl
</pre>
クエリが多くて一度に追うのが難しい場合はこの出力をファイルに向けることもできます。
<pre lang="Bash">
DBIC_TRACE=1=/path/to/query.log myscript.pl
</pre>
h2. トランザクション
DBIx::Class 0.08100以上をお使いであれば、明示的に何も指定しなくてもDBIx::Class::Storage::TxnScopeGuardを使用することができます。
<pre lang="Perl">
#!/usr/bin/perl
use strict;
use MyApp::Schema;
my $schema = MyApp::Schema->connection(...);
my $guard = $schema->txn_scope_guard();
# いろいろな作業...
$guard->commit;
</pre>
0.08100以前のDBIx::Classをお使いの場合はtxn_do()メソッドを使う必要があります。この方式では、関数リファレンスを引数として渡すことにより、その関数がトランザクション内で実行されるようになります。
<pre lang="Perl">
#!/usr/bin/perl
use strict;
use MyApp::Schema;
my $schema = MyApp::Schema->connection(...);
$schema->txn_do( sub {
my @args = @_;
# いろいろな作業...
}, @args );
</pre>
どちらも効果は一緒ですが、無名関数を使ってスコープを変更しなくてはならないtxn_do()に対して、TxnScopeGuardを使用するほうがコードが整理されます。
h2. タイムスタンプ
データの新規作成や変更時にその時間を記録したい場合が多々あります。この部分はデータベースベンダーごとに少しずつ実装が違うのでORMで吸収するのが難しいのですが、DBIx::Class::TimeStampを使うとDBIx::Classのレイヤーでこの処理を行ってくれます:
<pre lang="Perl">
package MyApp::Schema::Record;
use strict;
use base qw(DBIx::Class);
__PACKAGE__->load_components( qw(TimeStamp Core) );
__PACKAGE__->add_columns(
.... 普通のカラム ....
created_on => { # 作成時のみに更新
data_type => "DATETIME",
is_nullable => 0,
set_on_create => 1, # 作成時のみ、の指定
},
modified_on => { # 作成および更新時に更新
data_type => "DATETIME",
is_nullable => 0,
set_on_create => 1, # 作成時の指定
set_on_update => 1, # 更新時の指定
}
);
1;
</pre>
h2. 登録されているテーブル情報を抜き出す
<pre lang="Perl">
use strict;
use MyApp::Schema;
use Data::Dumper;
my $schema = MyApp::Schema->connect(...);
foreach my $name ($schema->sources) {
my $source = $schema->source($name);
# この $sourceがいろいろと情報を持っている
print "moniker = $name\n";
print "table name = ", $source->from, "\n";
foreach my $column ($source->columns) {
print " column: $column\n";
print Dumper( $source->column_info($column) );
}
}
</pre>