sql >> Base de Datos >  >> RDS >> PostgreSQL

Compatibilidad con SQLAlchemy de esquemas de Postgres

Bueno, hay algunas maneras de hacerlo y depende de cómo esté estructurada su aplicación. Esta es la forma más básica:

meta = MetaData(schema="client1")

Si la forma en que se ejecuta su aplicación es un "cliente" a la vez dentro de toda la aplicación, ya está.

Pero lo que puede estar mal con eso aquí es que cada tabla de esos metadatos está en ese esquema. Si desea que una aplicación admita varios clientes simultáneamente (por lo general, lo que significa "multiinquilino"), esto sería difícil de manejar, ya que necesitaría crear una copia de los metadatos y duplicar todas las asignaciones para cada cliente. Este enfoque se puede hacer, si realmente lo desea, la forma en que funciona es acceder a cada cliente con una clase asignada particular como:

client1_foo = Client1Foo()

y en ese caso estaría trabajando con la receta del "nombre de la entidad" en http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName junto con sometable.tometadata() (ver http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).

Entonces, digamos que la forma en que realmente funciona es con múltiples clientes dentro de la aplicación, pero solo uno a la vez por hilo. Bueno, en realidad, la forma más sencilla de hacerlo en Postgresql sería establecer la ruta de búsqueda cuando comience a trabajar con una conexión:

# 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()

El enfoque final sería anular el compilador usando la extensión @compiles para pegar el nombre de "esquema" dentro de las declaraciones. Esto es factible, pero sería complicado ya que no hay un gancho consistente para todos los lugares donde se genera la "Tabla". Su mejor apuesta probablemente sea establecer la ruta de búsqueda en cada solicitud.