PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SQLAlchemy-Unterstützung von Postgres-Schemas

Nun, es gibt ein paar Möglichkeiten, dies zu tun, und es hängt davon ab, wie Ihre App strukturiert ist. Hier ist der einfachste Weg:

meta = MetaData(schema="client1")

Wenn die Art und Weise, wie Ihre App ausgeführt wird, jeweils nur ein "Client" innerhalb der gesamten Anwendung ist, sind Sie fertig.

Aber was hier möglicherweise falsch ist, ist, dass sich jede Tabelle aus diesen Metadaten in diesem Schema befindet. Wenn Sie möchten, dass eine Anwendung mehrere Clients gleichzeitig unterstützt (was normalerweise „mehrinstanzenfähig“ bedeutet), wäre dies unhandlich, da Sie eine Kopie der Metadaten erstellen und alle Zuordnungen für jeden Client duplizieren müssten. Dieser Ansatz kann durchgeführt werden, wenn Sie es wirklich wollen. Die Art und Weise, wie es funktioniert, ist, dass Sie auf jeden Client mit einer bestimmten zugeordneten Klasse zugreifen, wie zum Beispiel:

client1_foo = Client1Foo()

und in diesem Fall würden Sie mit dem Rezept "Entitätsname" unter http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName in Verbindung mit sometable.tometadata() arbeiten (siehe http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).

Nehmen wir also an, die Art und Weise, wie es wirklich funktioniert, sind mehrere Clients innerhalb der App, aber jeweils nur einer pro Thread. Nun, der einfachste Weg, dies in Postgresql zu tun, wäre, den Suchpfad festzulegen, wenn Sie anfangen, mit einer Verbindung zu arbeiten:

# start request

# new session
sess = Session()

# set the search path
sess.execute("SET search_path TO client1")

# do stuff with session

# close it.  if you're using connection pooling, the
# search path is still set up there, so you might want to 
# revert it first
sess.close()

Der letzte Ansatz wäre, den Compiler mit der @compiles-Erweiterung zu überschreiben, um den "Schema"-Namen in Anweisungen einzufügen. Dies ist machbar, wäre aber schwierig, da es keinen konsistenten Haken für überall gibt, wo "Tabelle" generiert wird. Am besten legen Sie wahrscheinlich den Suchpfad für jede Anfrage fest.