当我尝试使用 Fixtures 转储数据库时:
dbic-migration --schema_class App::Schema --database PostgreSQL -Ilib dump_all_sets
我遇到错误:
DBIx::Class::Schema::source(): Can't find source for Schet at /home/xxx/lib/perl5/x86_64-linux/Moose/Meta/Method/Delegation.pm line 110
在主应用程序中我写起来没有问题:
$schema->resultset('Schet')
如何修复此错误并将数据转储到装置中?
在 DBIx::Class::Schema::Loader 中,我们正在连接到临时架构。
发生连接时,架构将被克隆
但是因为只传递了模式名称,所以没有任何内容克隆,因此具有空的类映射。这是错误的。
如果仔细观察,您会发现克隆发生了两次:here和here。这种额外的克隆是浪费的,应该重构。
作为解决方法here应该被重新传递到所需的命名空间克隆模式中:
sub _make_schema_at {
my ($self, $name, %extra_opts) = @_;
my $schema = $self->schema->clone;
bless $schema, $name;
DBIx::Class::Schema::Loader::make_schema_at
$schema, {_merge_opts(%extra_opts)}, [{_rearrange_connect_info($schema->storage)}];
}
UPD
最近,当创建新的加载程序时,
naming
被迫current
而不是传递参数,而参数又是从应用程序模式克隆的。 (我没有检查这一点,但是当应用程序有自己的naming
时,这会在转储数据时导致问题)并且再次调用loader。这里加载器加载类基于表名称而不是包名称(它是如何在__PACKAGE__->load_namespaces( ... )
完成的)
最后
@to_register
列出不同:
[
Ip,
App::Schema0::Result::Ip,
]
[
Scheta,
App::Schema0::Result::Scheta,
]
这里:
[
IP,
App::Schema::Result::IP,
],
[
Schet,
App::Schema::Result::Schet,
],
最近在 docker 容器内遇到了这个问题。奇怪的是,某些 DBIx 目录的权限错误。它们至少需要可读。还要检查文件/目录所有权。
像上面的@bliako一样,当 DBIx::Class 源以大写字母命名时,我遇到了这个错误(尽管是间歇性的),例如“Foo”,桌子全部较低,例如“富”
一旦我重命名了表格,到目前为止的错误就消失了。在使用这个模块 10 多年的时间里,我以前从未见过这个。