2009-07-07 10 views
1

Ich mache eine Anwendung, die mehrere sqlite3-Datenbanken verwendet, die mit Daten von einer externen Anwendung vorbelegt sind. Jede Datenbank hat die exakt gleichen Tabellen, aber mit unterschiedlichen Daten.Wechseln der Datenbanken in TG2 während der Laufzeit

Ich möchte zwischen diesen Datenbanken nach Benutzereingabe wechseln können. Was ist der eleganteste Weg, dies in TurboGears 2 zu tun?

+0

Fast jedes andere Design ist besser als das. Warum können Sie keine einzelne Datenbank aus mehreren Quellen laden? –

+0

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

+0

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

Antwort

1

Wenn ALLE Datenbanken das gleiche Schema haben, dann sollten Sie in der Lage sein, mehrere Sitzungen mit demselben Modell zu den verschiedenen DBs zu erstellen.

1

Dzhelil,

Ich schrieb ein Blog eine Weile Post zurück über mehrere Datenbanken in TG2 verwenden. Sie könnten diese Methode mit Jorges Vorschlag mehrerer DBS-Sitzungen kombinieren, und ich denke, Sie könnten dies leicht tun.

How to use multiple databases in TurboGears 2.0

hoffte, das hilft, Seth

1

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.