6

Moose は初めてで、DBIx::Class で使用しようとしています。基本的な DBIC のクエリと更新は機能しますが、属性を変更すると、書き込もうとしたトリガーが実行されません。

use Modern::Perl;
use Data::Dumper;

my $schema = My::Schema->connect(<connect str>, <usr>, <psw>) or die $!;
my $rs = $schema->resultset('Isin')->search( sid => 3929 );
my $security_obj = $rs->first;
print $security_obj->isin, "\n";
$security_obj->isin('Test1Foo'); # <- expect to see FOO printed by trigger
print $security_obj->isin, "\n";

'isin' print 'FOO' のトリガーが表示されることを期待していますが、何も起こりません。パッケージから DBIx::Class を取り除くと、トリガーは期待どおりに実行されます。

DBIx::Class がトリガーの発火を妨げるような方法で値を設定していると思われます。

残念ながら、Moose での DBIx::Class の使用に関するリソースを見つけることができませんでした。私が書いたものは、ほとんどDBIx::Class と Mooseで見つけたものに基づいています。

DBIx::Class や Moose を間違って使用していますか? Mooseで使用すべき別のORMはありますか?

起動しないトリガーを含むパッケージ:

package My::Schema::Result::Isin;

use DBIx::Class;
use Moose;
use Carp;
extends 'DBIx::Class';

has 'isin'   => ( is => "rw", isa => "Str", trigger => \&_mod_isin);
has 'sid'    => ( is => "ro", isa => "Int");

sub _mod_isin {
    print "FOO\n";
    return;
};

 no Moose;

__PACKAGE__->load_components('Core');

__PACKAGE__->table('isin');

__PACKAGE__->add_columns(
  isin  => { data_type => 'varchar2', size => 12 },
  sid   => { data_type => 'integer',  size => 6 },
);

__PACKAGE__->set_primary_key('isin');
4

2 に答える 2

2

まず、Moose内から非Mooseクラスを拡張するという問題があります。DBIx::ClassはMoose::Objectを継承しないため、これは問題です。そのため、のような標準のMooseメソッドを取得できませんdoes。この問題を解決するには、Moose :: Cookbook :: Basics::Recipe11を参照してください。

次に、サブルーチンを作成しようとしている2つの異なる魔法のセットがあるという大きな問題があります。isin魔法が作成してサブルーチンを作成するMooseがあり、魔法が作成してMooseが作成したものを置き換えるサブルーチンもsid作成するDBIx::Classがあります。isinsid

aroundjrockwayが提案したように、修飾子を使用してMooseロールで作成することをお勧めします。

于 2010-08-27T08:15:10.753 に答える
-3

writer => \&_mod_isin代わりに使ってみましたか?

于 2010-03-06T09:34:15.477 に答える