読者です 読者をやめる 読者になる 読者になる

DBIC::Schema::Loader で 2回 connect すると……

DBIC

DBIx::Class::Schema::Loader(0.04004) で 2回 connect したら何か変。

package MySchema;
use base qw/ DBIx::Class::Schema::Loader /;
__PACKAGE__->loader_options( relationships => 1 );
1;
package MySchema::Foo;
use base qw/ DBIx::Class /;
__PACKAGE__->load_components( qw/ InflateColumn::DateTime PK::Auto Core /);
__PACKAGE__->add_columns( created_on => { data_type => 'datetime' } );
1;

こういう定義で InflateColumn::DateTime を使うようにして、以下のようなコードを実行する。

use MySchema;
my @dsn = qw/ dbi:Pg:dbname=testdb fujiwara /;
$s1 = MySchema->connect(@dsn);
print $s1->resultset('Foo')->find(1)->created_on->epoch, "\n";
$s2 = MySchema->connect(@dsn);
print $s2->resultset('Foo')->find(1)->created_on->epoch, "\n";

実行結果

1196725255
Can't call method "epoch" without a package or object reference at s.pl line 7.

2回目の connect 後には Inflate されない。0.003012 だと大丈夫。
loader_options に debug => 1 を指定してみたら、0.03012 では初回 connect 時のみ DB のスキーマ定義を読んでいるのだが、0.04004 では 2回目の connect 時にも読み込んでいるような。このときに Inflate がおかしくなるのか。
なんで2回 connect する必要があったかというと、mod_perl のアプリケーション(それぞれ DBIC::Schema::Loader を使って、同じ DB に接続する)を 2つ、Apache に読み込んだから。
後からアプリケーションをひとつ追加した途端に、今まで動いていた方までぼろぼろになって焦った。