DBIx::类错误“找不到 XXX 的源”

问题描述 投票:0回答:3

当我尝试使用 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')

如何修复此错误并将数据转储到装置中?

perl fixtures dbix-class
3个回答
1
投票

DBIx::Class::Schema::Loader 中,我们正在连接到临时架构。

发生连接时,架构将被克隆

但是因为只传递了模式名称,所以没有任何内容克隆,因此具有空的类映射。这是错误的。

如果仔细观察,您会发现克隆发生了两次:herehere。这种额外的克隆是浪费的,应该重构。

作为解决方法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,
],

0
投票

最近在 docker 容器内遇到了这个问题。奇怪的是,某些 DBIx 目录的权限错误。它们至少需要可读。还要检查文件/目录所有权。


0
投票

像上面的@bliako一样,当 DBIx::Class 源以大写字母命名时,我遇到了这个错误(尽管是间歇性的),例如“Foo”,桌子全部较低,例如“富”

一旦我重命名了表格,到目前为止的错误就消失了。在使用这个模块 10 多年的时间里,我以前从未见过这个。

© www.soinside.com 2019 - 2024. All rights reserved.