/ / add_triggerメソッドを使用して `DBIx :: Class`の助けを借りてDBにトリガーを作成する方法は? -perl、dbix-class

add_triggerメソッドを使って `DBIx :: Class`の助けを借りてDBにトリガを作成するには? - perl、dbix-class

データベースにトリガーを追加したい。私が使う DBIx::Class そして、これらの例に従ってください: 1, 2.
私のコードは:

package App::Schema;
use base qw/DBIx::Class::Schema/;
__PACKAGE__->load_namespaces();

sub sqlt_deploy_hook {
my ($self, $schema) = @_;
$schema->add_trigger( name => "foo" );
}

1;

しかし、私はこのエラーが発生します:

Failed to translate to YAML: translate: Error with producer "SQL::Translator::Producer::YAML": Can"t call method "name" on an undefined value at /home/kes/work/projects/x/app/local/lib/perl5/SQL/Translator/Schema/Trigger.pm line 198

必要なすべての環境変数でコマンドを実行するとき dbic-migration

dbic-migration --force --schema_class App::Schema --database PostgreSQL -Ilib prepare

どこかに私を向ける SQL::Translator::Schema::Trigger

私は何を取りこぼしたか?このエラーを修正するには?

UPD

すべての引数を追加してもエラーが発生しました:

Failed to translate to YAML: translate: Error with parser "SQL::Translator::Parser::DBIx::Class": Table named users doesn"t exist at /home/kes/work/projects/x/app/local/lib/perl5/SQL/Translator/Schema/Trigger.pm line 54

ここに ターゲット行:

my $table = $args->{schema}->get_table($arg)
or die "Table named $arg doesn"t exist";

修正されたコード

sub sqlt_deploy_hook {
my ($self, $schema) = @_;

warn "TABLES: " ,$schema->get_tables ,"n";
$schema->add_trigger(()
,name =>  "foo"
,perform_action_when => "after"
,database_events     => "insert"
,on_table => "users"
,action => "text"
,scope => "row"
);
}

このコードは次の警告を生成します:

TABLES: users
TABLES: dbix_class_deploymenthandler_versions

ただし、DBには現在1つのテーブルしかありません。私は少なくともそれが生成することを期待しています:

TABLES: users dbix_class_deploymenthandler_versions

トリガーを作成する方法 DB

回答:

回答№1は0

おそらく問題がある DBIx :: Class :: ResultSource :: default_sqlt_deploy_hook

当初は、Resultクラス名と$ sqlt_tableインスタンスを期待するように設計されていました デプロイされるテーブル

回避策として、前に次のコード行を追加します add_trigger

return   unless grep $_ eq "users",  $schema->get_tables;

ただし、推奨される方法はdeploy / upgrade / downgradeを作成することです .sql ファイルを手動で