簡體   English   中英

使用DBIX :: Class時,Moose觸發器不會觸發

[英]Moose Triggers Not Firing When Using 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和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 ::類不從麋:對象繼承,所以你不會得到標准的麋方法,比如does 請參閱Moose :: Cookbook :: Basics :: Recipe11以解決此問題。

其次,你有更大的問題,你有兩套不同的魔法試圖為你創建子程序。 你有Moose,它的魔法創建了isinsid子程序,你有DBIx :: Class,它的魔法還創建了isinsid子程序,它們取代了Moose創建的子程序。

正如jrockway建議的那樣,您可能希望使用around修飾符來構成Moose角色。

您是否嘗試過使用writer => \\&_mod_isin

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM