SQLAlchemy deklarative Syntax mit Autoload (Reflexion) in Pylonen

8

Ich möchte Autoload verwenden, um eine existing-Datenbank zu verwenden. Ich weiß, wie man es ohne deklarative Syntax macht (model / _ init _. Py):

%Vor%

Das funktioniert gut, aber ich würde gerne deklarative Syntax verwenden:

%Vor%

Leider bekomme ich so:

  

sqlalchemy.exc.UnboundExecutionError: Keine Engine ist an die MetaData dieser Tabelle gebunden. Übergeben Sie eine Engine über autoload_with = & lt; sameengine & gt; an die Tabelle, oder verknüpfen Sie die MetaData mit einer Engine über metadata.bind = & lt; someengine & gt;

Das Problem hier ist, dass ich nicht weiß, woher die Engine kommen soll (um sie in autoload_with zu verwenden), wenn das Modell importiert wird (es ist in init_model () verfügbar). Ich habe versucht,

hinzuzufügen %Vor%

zu environment.py, aber es funktioniert nicht. Hat jemand eine elegante Lösung gefunden?

    
Juliusz Gonera 24.12.2010, 13:02
quelle

3 Antworten

10

OK, ich denke, ich habe es herausgefunden. Die Lösung besteht darin, die Modellobjekte außerhalb von model/__init__.py zu deklarieren. Ich folgerte, dass __init__.py als erste Datei importiert wird, wenn etwas aus einem Modul importiert wird (in diesem Fall model ) und dies Probleme verursacht, da die Modellobjekte deklariert werden, bevor init_model() aufgerufen wird.

Um dies zu vermeiden, habe ich eine neue Datei im Modul model erstellt, z. %Code%. Ich habe dann alle meine Modellobjekte (wie objects.py ) in dieser Datei deklariert.

Dann kann ich meine Modelle so importieren:

%Vor%

Um die Angabe von Event für jede Tabelle zu vermeiden, fügte ich diese Zeile am Ende von autoload-with hinzu:

%Vor%

Auf diese Weise kann ich meine Modellobjekte ohne Code wie folgt deklarieren:

%Vor%     
Juliusz Gonera 29.12.2010, 16:51
quelle
1

Ich habe es gerade mit dem orm-Modul versucht.

%Vor%

Zugreifen auf Tabellen manuell oder über eine Schleife oder was auch immer:

%Vor%

Könnte nützlich sein.

    
user2290820 06.11.2014 09:46
quelle
0

Sehen Sie sich das Verwenden von SQLAlchemy mit Pylonen-Tutorial an Binden Sie Metadaten an die Suchmaschine in der Funktion init_model .

Wenn die meta.Base.metadata.bind(engine) -Anweisung Ihre Modellmetadaten erfolgreich an die Engine bindet, sollten Sie diese Initialisierung in Ihrer eigenen init_model -Funktion durchführen können. Ich nehme an, Sie wollten die Metadatenbindung in dieser Funktion nicht überspringen, oder?

    
scoffey 28.12.2010 04:19
quelle