こないだ書いた Catalyst の DBIC モデルを外部スクリプトから利用するっていうやつ、DBIx::Class::Schema::Loader つかえばいいね。
use FindBin;
use lib "$FindBin::Bin/../lib";
{
package MyApp::Model::DBIC;
use base qw/DBIx::Class::Schema::Loader/;
__PACKAGE__->load_from_connection(
dsn => 'dbi:...',
);
__PACKAGE__->load_classes;
}
こんな感じにすれば、MyApp::Model::DBIC::*
をロードしてくれる。
全部ロードしてもいいなら use MyApp;
で終わりなんだけど多分ほとんどの場合外部スクリプトから必要なのはモデル部分だけだと思われる。
find_or_new
sub find_or_new { my $class = shift; my $attr = @_ > 1 ? {@} : $[0]; my $exists = $class->find($attr); return defined $exists ? $exists : $class->new($attr); }
find_or_create
はあるのにこれはないとか謎い。NOT NULL なカラムもってるテーブルだとあんまりつかえねーよ>find_or_create
DBD::SQLite のバグ?
DBIC::Loader の blblack さんが綺麗なサンプルを返信してくれたのでそれを書くと、
my $test_ite = DBIC::Test->search;
while ( my $test = $test_ite->next ) { # Fails
###foreach my $test ($test_ite->all) { # Works
$test->text( $test->text . ' updated' );
$test->update;
}
とかで、イテレータでまわそうとするとupdate時に死ぬ。(searchで複数の行が帰ってくる場合)
配列で全部とってきてまわしたときは普通に動く。
ちなみに、DBIC::Test->search->all というのは CDBI でいうリストコンテキストでの search と同じことです。もちろん CDBI と同じように
my @tests = DBIC::Test->search;
ともかけるす。というか僕は最初そやって投稿したので、上の例が帰ってきたときにネイティブDBIC使いとの違いを知らしめられたという感じです。