Perl / DBIx::Class::Schema::Loader 后缀 _2 来复制关系名称
Perl / DBIx::Class::Schema::Loader suffixes _2 to duplicate relationship name
我是 Perl 的新手,需要维护这个 Catalyst 项目。有一个 MySQL 数据库,通过 DBIx 连接,我需要做一些更改。在我找到的项目的文档中,模型是如何创建的:
dev:~# script/prj_create.pl
model PrjDB DBIC::Schema
prj::Schema::PrjDB
create=static
preserve_case=1
moniker_map='sub {return $_[0];}'
col_accessor_map='sub {return $_[0];}'
inflect_plural='sub {return $_[0];}'
inflect_singular='sub {return $_[0];}'
exclude='^view_'
components=TimeStamp,PassphraseColumn,DynamicDefault
use_moose=1
dbi:mysql:prj root ********
在数据库中有这样的关系
company_user belongs_to company (foreign key)
company_user has_many company_user ("last_changed_by_user")
company_user has_many company (secondary relationship via "last_changed_by_user")
我得到的原始模型在 "company_user.pm" 中创建了以下行:
__PACKAGE__->has_many(
"company",
"prj::Schema::PrjDB::Result::company",
{ "foreign.last_changed_by" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
__PACKAGE__->belongs_to(
"company",
"prj::Schema::PrjDB::Result::company",
{ id => "company" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
如果我现在尝试重新创建我得到的模型:
__PACKAGE__->has_many(
"company",
"prj::Schema::PrjDB::Result::company",
{ "foreign.last_changed_by" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
__PACKAGE__->belongs_to(
"company_2",
"prj::Schema::PrjDB::Result::company",
{ id => "company" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
(注意 belongs_to 包中的“_2”后缀。)
使用此模型时,所有现有代码都会中断,因为它无法再找到某些方法。坦率地说,我真的不知道要搜索什么,所以我希望这里有人能帮助我。
加载程序中是否有我需要设置/取消设置的任何选项,或者它可能甚至不需要对加载程序执行任何操作?
编辑:
到目前为止,我为 {rel}_2 符号找到的唯一东西是在 ResultSet class 中,它说:
If the same join is supplied twice, it will be aliased to {rel}_2 (and similarly for a third time).
我不知道,这是否是我问题的根源以及如何规避它。
有一件事,我在最初的问题中没有:工作模型是使用 2012 年的 DBIx 版本创建的(?我认为,没有记录),我现在使用最新的可用模型。
我建议第二行是你的问题:
company_user belongs_to company (foreign key)
company_user has_many company_user ("last_changed_by_user")
company_user has_many company (secondary relationship via "last_changed_by_user")
您的用户 table 与自身有外键关系,因此由于其与自身的 has_many
关系称为 company
,因此 belongs_to
关系被命名为 company_2
.
我的猜测是以前的版本做了类似的事情,但是程序员编辑了生成的文件以将 company_2
更改为其他名称。
我会猜测损坏的代码是在抱怨缺少关系。这将是您需要使用的名称。
但是为什么要重新生成 DBIC 内容而不是直接编辑它?
它没有致力于源代码管理吗?
我通过 rel_name_map
重新映射生成器脚本调用中的错误名称,解决了命名问题。只有两个有问题的连接,所以我的努力就足够了。我知道这不是通用的解决方案,但也许对某人有帮助。
我这样使用 rel_name_map
:
dev:~# script/prj_create.pl
model PrjDB DBIC::Schema
prj::Schema::PrjDB
create=static
preserve_case=1
moniker_map='sub {return $_[0];}'
rel_name_map="{company_2 => \"company\", user_2 => \"user\"}"
col_accessor_map='sub {return $_[0];}'
inflect_plural='sub {return $_[0];}'
inflect_singular='sub {return $_[0];}'
exclude='^view_'
components=TimeStamp,PassphraseColumn,DynamicDefault
use_moose=1
dbi:mysql:prj root ********
我是 Perl 的新手,需要维护这个 Catalyst 项目。有一个 MySQL 数据库,通过 DBIx 连接,我需要做一些更改。在我找到的项目的文档中,模型是如何创建的:
dev:~# script/prj_create.pl
model PrjDB DBIC::Schema
prj::Schema::PrjDB
create=static
preserve_case=1
moniker_map='sub {return $_[0];}'
col_accessor_map='sub {return $_[0];}'
inflect_plural='sub {return $_[0];}'
inflect_singular='sub {return $_[0];}'
exclude='^view_'
components=TimeStamp,PassphraseColumn,DynamicDefault
use_moose=1
dbi:mysql:prj root ********
在数据库中有这样的关系
company_user belongs_to company (foreign key)
company_user has_many company_user ("last_changed_by_user")
company_user has_many company (secondary relationship via "last_changed_by_user")
我得到的原始模型在 "company_user.pm" 中创建了以下行:
__PACKAGE__->has_many(
"company",
"prj::Schema::PrjDB::Result::company",
{ "foreign.last_changed_by" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
__PACKAGE__->belongs_to(
"company",
"prj::Schema::PrjDB::Result::company",
{ id => "company" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
如果我现在尝试重新创建我得到的模型:
__PACKAGE__->has_many(
"company",
"prj::Schema::PrjDB::Result::company",
{ "foreign.last_changed_by" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
__PACKAGE__->belongs_to(
"company_2",
"prj::Schema::PrjDB::Result::company",
{ id => "company" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
(注意 belongs_to 包中的“_2”后缀。)
使用此模型时,所有现有代码都会中断,因为它无法再找到某些方法。坦率地说,我真的不知道要搜索什么,所以我希望这里有人能帮助我。
加载程序中是否有我需要设置/取消设置的任何选项,或者它可能甚至不需要对加载程序执行任何操作?
编辑: 到目前为止,我为 {rel}_2 符号找到的唯一东西是在 ResultSet class 中,它说:
If the same join is supplied twice, it will be aliased to {rel}_2 (and similarly for a third time).
我不知道,这是否是我问题的根源以及如何规避它。
有一件事,我在最初的问题中没有:工作模型是使用 2012 年的 DBIx 版本创建的(?我认为,没有记录),我现在使用最新的可用模型。
我建议第二行是你的问题:
company_user belongs_to company (foreign key)
company_user has_many company_user ("last_changed_by_user")
company_user has_many company (secondary relationship via "last_changed_by_user")
您的用户 table 与自身有外键关系,因此由于其与自身的 has_many
关系称为 company
,因此 belongs_to
关系被命名为 company_2
.
我的猜测是以前的版本做了类似的事情,但是程序员编辑了生成的文件以将 company_2
更改为其他名称。
我会猜测损坏的代码是在抱怨缺少关系。这将是您需要使用的名称。
但是为什么要重新生成 DBIC 内容而不是直接编辑它? 它没有致力于源代码管理吗?
我通过 rel_name_map
重新映射生成器脚本调用中的错误名称,解决了命名问题。只有两个有问题的连接,所以我的努力就足够了。我知道这不是通用的解决方案,但也许对某人有帮助。
我这样使用 rel_name_map
:
dev:~# script/prj_create.pl
model PrjDB DBIC::Schema
prj::Schema::PrjDB
create=static
preserve_case=1
moniker_map='sub {return $_[0];}'
rel_name_map="{company_2 => \"company\", user_2 => \"user\"}"
col_accessor_map='sub {return $_[0];}'
inflect_plural='sub {return $_[0];}'
inflect_singular='sub {return $_[0];}'
exclude='^view_'
components=TimeStamp,PassphraseColumn,DynamicDefault
use_moose=1
dbi:mysql:prj root ********