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?
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:
Auf diese Weise kann ich meine Modellobjekte ohne Code wie folgt deklarieren:
%Vor%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.
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?
Tags und Links python reflection sqlalchemy declarative pylons