ich zwei Datenbanken für eine Nur-Lese-Anwendung verwenden. Die zweite Datenbank ist ein Cache für den Fall, dass die primäre Datenbank inaktiv ist. Ich verwende zwei Objekte, um die Verbindung, Metadaten und kompatible Table
Instanzen zu halten. Der obere Teil der View-Funktion weist db = primary
oder db = secondary
zu und der Rest ist nur Abfragen gegen db.tableA.join(db.tableB)
. Ich benutze das ORM nicht.
Die Schemata sind nicht genau identisch. Die primäre Datenbank benötigt ein Präfix schema.
(Table(...schema='schema')
) und die Cache-Datenbank nicht. Um dies zu umgehen, erstelle ich meine Tabellenobjekte in einer Funktion, die den Schemanamen als Argument verwendet. Indem ich die Funktion einmal für jede Datenbank aufruft, komme ich mit kompatiblen Table
-Objekten mit Präfix voran.
Zumindest in Pylons ist die SQLAlchemy meta.Session
eine ScopedSession
. Die Anwendung BaseController
in appname/lib/base.py
ruft Session.remove()
nach jeder Anfrage. Es ist wahrscheinlich besser, eine einzige Session
zu haben, die mit beiden Datenbanken kommuniziert, aber wenn Sie nicht, müssen Sie möglicherweise Ihre BaseController
ändern, um .remove()
auf jedem Session
aufzurufen.
Fast jedes andere Design ist besser als das. Warum können Sie keine einzelne Datenbank aus mehreren Quellen laden? –
Oder hängen Sie die externen Datenbanken an Ihre aktuelle an. Dadurch verhalten sie sich wie in derselben Verbindung, nur in einem anderen Namespace. – Christopher
Um alles in eine Datenbank zu laden, müsste ich das Schema ändern, und ich kann das nicht tun, da andere Anwendungen von diesem Schema abhängig sind. Der ATTACH-Vorschlag klingt interessant, aber ich kann mir keinen Weg vorstellen, wie es in meinem Fall funktioniert. Ich verlasse mich auf sqlalchemy, um mein Modell deklarativ zu erstellen, und jede Modellklasse ist einem Tabellennamen zugeordnet. Um identische Datenbanken anzuhängen, muss ich jeden Tabellennamen mit einem Bezeichner versehen, der sqlalchemy bricht. – dzhelil