gpt4 book ai didi

perl - 使用DBIX::Class时驼鹿触发器不触发

转载 作者:行者123 更新时间:2023-12-04 16:14:29 25 4
gpt4 key购买 nike

我是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');

最佳答案

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

其次,更大的问题是,您有两组不同的魔术试图为您创建子例程。您有Moose,其魔术可以创建isinsid子例程,还有DBIx::Class,其魔术也可以创建isinsid子例程,以替换Moose创建的子例程。

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

关于perl - 使用DBIX::Class时驼鹿触发器不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com