sql >> Databasteknik >  >> RDS >> PostgreSQL

SQLAlchemy-stöd för Postgres Schemas

det finns några sätt att gå på och det beror på hur din app är uppbyggd. Här är det mest grundläggande sättet:

meta = MetaData(schema="client1")

Om sättet som din app körs på är en "klient" i taget inom hela programmet, är du klar.

Men vad som kan vara fel med det här är att varje tabell från den metadatan finns på det schemat. Om du vill att en applikation ska stödja flera klienter samtidigt (vanligtvis vad "multitenant" betyder), skulle detta vara svårt eftersom du måste skapa en kopia av MetaData och dupera ut alla mappningar för varje klient. Detta tillvägagångssätt kan göras, om du verkligen vill, hur det fungerar är att du kommer åt varje klient med en viss mappad klass som:

client1_foo = Client1Foo()

och i så fall skulle du arbeta med "entitetsnamn"-receptet på http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName i kombination med sometable.tometadata() (se http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).

Så låt oss säga att hur det verkligen fungerar är flera klienter i appen, men bara en åt gången per tråd. Tja, faktiskt, det enklaste sättet att göra det i Postgresql skulle vara att ställa in sökvägen när du börjar arbeta med en anslutning:

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

Det sista tillvägagångssättet skulle vara att åsidosätta kompilatorn genom att använda @compiles-tillägget för att fästa "schema"-namnet i satser. Detta är genomförbart, men skulle vara knepigt eftersom det inte finns en konsekvent krok överallt där "tabell" genereras. Det bästa är förmodligen att ställa in sökvägen för varje begäran.



  1. Oracle 11g:Standard till statiskt värde när frågan inte returnerar något

  2. Hur man visar rader som inte finns i en annan tabell i MySQL

  3. Kör SCRIPT från PL/SQL Block

  4. SQL WHERE-sats