DBIx ::类错误“无法找到XXX的源代码”

时间:2017-09-05 19:23:59

标签: perl fixtures dbix-class

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

如何解决此错误并将数据转储到灯具中?

2 个答案:

答案 0 :(得分:1)

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

发生连接时,架构为cloned

但是因为那里只有schema name is passed没有cloned,因此有空类映射。这是错的。

如果仔细观察,您会看到克隆发生两次: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

Lately,当创建新的加载器时,naming被强制为current而不是传递参数,而参数又是从应用程序模式克隆的。 (我不检查,但是当应用程序有自己的naming时,这会在转储数据时导致问题)和loader is invoked again。这里的loader加载类based on table names而不是包名(如何在__PACKAGE__->load_namespaces( ... )完成)

最后@to_register列表不同:

Here

[
  Ip,
  App::Schema0::Result::Ip,
]
[
  Scheta,
  App::Schema0::Result::Scheta,
]

Here

[
  IP,
  App::Schema::Result::IP,
],
[
  Schet,
  App::Schema::Result::Schet,
],

答案 1 :(得分:0)

最近在docker容器中闯入了这个。奇怪的是,某些DBIx目录具有错误的权限。它们至少必须是可读的。还要检查文件/目录的所有权。