sql >> Database >  >> RDS >> PostgreSQL

SQLAlchemy-ondersteuning van Postgres Schemas

er zijn een paar manieren om dit te doen en het hangt af van hoe uw app is gestructureerd. Dit is de meest eenvoudige manier:

meta = MetaData(schema="client1")

Als de manier waarop uw app werkt één "client" tegelijk is binnen de hele applicatie, bent u klaar.

Maar wat hier mis mee kan zijn, is dat elke tabel van die metadata op dat schema staat. Als u wilt dat één toepassing meerdere clients tegelijkertijd ondersteunt (meestal wat "multitenant" betekent), zou dit onpraktisch zijn, omdat u een kopie van de MetaData zou moeten maken en alle toewijzingen voor elke client zou moeten kopiëren. Deze aanpak kan worden gedaan, als je dat echt wilt, de manier waarop het werkt is dat je elke client opent met een bepaalde toegewezen klasse zoals:

client1_foo = Client1Foo()

en in dat geval zou je werken met het recept "entiteitsnaam" op http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName in combinatie met sometable.tometadata() (zie http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).

Dus laten we zeggen dat de manier waarop het echt werkt, meerdere clients in de app is, maar slechts één tegelijk per thread. Welnu, de gemakkelijkste manier om dat in Postgresql te doen, is door het zoekpad in te stellen wanneer u met een verbinding begint te werken:

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

De laatste benadering zou zijn om de compiler te overschrijven met behulp van de @compiles-extensie om de "schema"-naam in instructies te plakken. Dit is te doen, maar het zou lastig zijn omdat er geen consistente hook is voor overal waar "Table" wordt gegenereerd. Uw beste gok is waarschijnlijk het zoekpad voor elk verzoek in te stellen.



  1. Database-ontwerp 101:partities in MySQL

  2. SQL Server Bulk invoegen van CSV-bestand met inconsistente aanhalingstekens

  3. SQL BESTAAT-operator voor beginners

  4. Externe sleutelrelatie tussen twee databases toevoegen