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

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

不幸的是,我没有找到关于将 DBIx::Class 与 Moose 一起使用的资源。我所写的内容主要基于我在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来解决这个问题。

其次,你有一个更大的问题,即你有两组不同的魔法,它们试图为你创建子例程。你有 Moose,它的魔法创建isinsid子例程,你有 DBIx::Class,它的魔法也创建isinsid子例程来替换 Moose 创建的那些。

around正如 jrockway 建议的那样,您可能希望使用修饰符来组成 Moose 角色。

于 2010-08-27T08:15:10.753 回答
-3

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

于 2010-03-06T09:34:15.477 回答