2017-09-05 2 views
1

Wenn ich versuche, Datenbank-Dump mit Fixtures:DBIx :: Class Fehler "Can not Quelle für XXX finden"

dbic-migration --schema_class App::Schema --database PostgreSQL -Ilib dump_all_sets 

Ich habe Fehler:

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 

In Haupt-Anwendung, die ich nicht haben Problem zu schreiben:

$schema->resultset('Schet') 

Wie Sie diesen Fehler beheben und Daten in Fixtures ausgeben?

+0

Könnte eine Pluralisierung sein Problem. DBIx :: Class :: Schema :: Loader (und wahrscheinlich die anderen Dinge für automatisches Datendumping) generieren Ergebnis-/Tabellennamen auf der Grundlage von Regeln, um Wörter in Singular und Plural umzuwandeln. Sie sehen oft ein 's' am Ende. Manchmal ist es sogar schlauer, und DBIC enthält eine Menge Module als Abhängigkeiten für verschiedene Sprachen, um mehrere Moniker für Dinge zu machen. Aber wenn Ihre Tabellen in einer Sprache sind, die sie nicht unterstützt (wie Deutsch oder wahrscheinlich Russisch, besonders wenn sie transkribiert ist), könnte sie fehlschlagen. Vielleicht haben die DCSL und Fixtures verschiedene Namen erstellt? – simbabque

+0

@simbabque: Ich habe [this] gefunden (http://search.cpan.org/~ilmari/DBIx-Class-Schema-Loader/lib/DBIx/Class/Schema/Loader/Base.pm#naming). Heute plane ich, damit zu experimentieren. –

Antwort

1

in der DBIx::Class::Schema::Loader verbinden wir mit dem temporären Schema.

Wenn die Verbindung treten das Schema cloned

Aber wegen der dort nur schema name is passed nichts cloned ist und, als Ergebnis, leere Klassenzuordnung hat. Was falsch ist.

Wenn Sie genau hinsehen, werden Sie sehen, dass das Klonen zweimal erfolgt: here und here. Dieses zusätzliche Klonen ist verschwenderisch und sollte refaktoriert werden.

Da die Arbeiten rund um here sollte in die erforderlichen Namespace geklont Schema reblessed überbrückbar:

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, wenn neue Lader erstellt wird, wird die naming-current statt übergebene Argument gezwungen , die wiederum aus dem Anwendungsschema geklont wird. (Ich überprüfe das nicht, aber wenn die Anwendung ihre eigene naming hat, verursacht dies Probleme beim Dumping von Daten) und loader is invoked again. Hier Loader lädt Klassen based on table names statt Paketnamen (wie es bei __PACKAGE__->load_namespaces(...) geschieht)

Schließlich @to_register Listen unterscheiden:

Here

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

Here:

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