sql >> Database teknologi >  >> RDS >> PostgreSQL

SQLAlchemy-understøttelse af Postgres-skemaer

godt, der er et par måder at gå på, og det afhænger af, hvordan din app er struktureret. Her er den mest grundlæggende måde:

meta = MetaData(schema="client1")

Hvis den måde, din app kører på, er én "klient" ad gangen i hele applikationen, er du færdig.

Men hvad der kan være galt med det her er, at hver tabel fra den metadata er på det skema. Hvis du vil have et program til at understøtte flere klienter samtidigt (normalt hvad "multitenant" betyder), ville dette være uhåndterligt, da du skal oprette en kopi af MetaData og dupere alle kortlægninger for hver klient. Denne tilgang kan gøres, hvis du virkelig vil, den måde det fungerer på er, at du får adgang til hver klient med en bestemt kortlagt klasse som:

client1_foo = Client1Foo()

og i så fald ville du arbejde med "entity name"-opskriften på http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName i forbindelse med sometable.tometadata() (se http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).

Så lad os sige, at den måde, det virkelig fungerer på, er flere klienter i appen, men kun én ad gangen pr. tråd. Faktisk ville den nemmeste måde at gøre det på i Postgresql være at indstille søgestien, når du begynder at arbejde med en forbindelse:

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

Den endelige fremgangsmåde ville være at tilsidesætte compileren ved at bruge @compiles-udvidelsen til at sætte "skema"-navnet ind i sætninger. Dette kan lade sig gøre, men ville være vanskeligt, da der ikke er en ensartet krog for alle steder, hvor "Tabel" genereres. Dit bedste bud er sandsynligvis at angive søgestien for hver anmodning.



  1. opdatere forespørgsel med join på to tabeller

  2. Android:SQLite gemmer streng array?

  3. Hvordan kører man en lagret procedure i sql server hver time?

  4. Henter navnet på den aktuelle funktion inde i funktionen med plpgsql