使用DBIX :: Class时,Moose触发器不会触发

时间:2010-03-05 21:22:05

标签: perl moose dbix-class

我是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'打印'FOO'的触发器,但没有任何反应。如果我从包中删除DBIx :: Class,则按预期执行触发器。

我怀疑DBIx :: Class正在以阻止触发器触发的方式设置值。

不幸的是,我没有太多运气找到有关使用Moose的DBIx :: Class的资源。我所写的内容主要基于我在DBIx::Class and 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');

2 个答案:

答案 0 :(得分:2)

首先,你有从Moose内扩展非Moose类的问题。这是一个问题,因为DBIx :: Class不从Moose :: Object继承,因此您不会获得像does这样的标准Moose方法。请参阅Moose::Cookbook::Basics::Recipe11以解决此问题。

其次,你有更大的问题,你有两套不同的魔法试图为你创建子程序。你有Moose,它的魔法创建isinsid子程序,你有DBIx :: Class,它的魔法也会创建isinsid子程序来代替Moose创建

您可能希望使用around修饰符撰写Moose角色,如jrockway建议的那样。

答案 1 :(得分:-3)

您是否尝试过使用writer => \&_mod_isin