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

Supporto SQLAlchemy degli schemi Postgres

beh, ci sono alcuni modi per farlo e dipende da come è strutturata la tua app. Ecco il modo più semplice:

meta = MetaData(schema="client1")

Se il modo in cui viene eseguita l'app è un "client" alla volta all'interno dell'intera applicazione, il gioco è fatto.

Ma ciò che potrebbe essere sbagliato in questo qui è che ogni tabella da quel metadati si trova su quello schema. Se desideri che un'applicazione supporti più client contemporaneamente (di solito cosa significa "multi-tenant"), questo sarebbe ingombrante poiché dovresti creare una copia dei metadati e duplicare tutte le mappature per ciascun client. Questo approccio può essere fatto, se lo desideri davvero, il modo in cui funziona è accedere a ciascun client con una particolare classe mappata come:

client1_foo = Client1Foo()

e in tal caso lavoreresti con la ricetta "nome entità" su http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName insieme a sometable.tometadata() (vedi http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).

Quindi supponiamo che il modo in cui funziona davvero sia più client all'interno dell'app, ma solo uno alla volta per thread. Bene, in realtà, il modo più semplice per farlo in Postgresql sarebbe impostare il percorso di ricerca quando inizi a lavorare con una connessione:

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

L'approccio finale sarebbe sovrascrivere il compilatore usando l'estensione @compiles per inserire il nome "schema" all'interno delle istruzioni. Questo è fattibile, ma sarebbe complicato in quanto non esiste un hook coerente per ovunque venga generata "Table". La soluzione migliore è probabilmente impostare il percorso di ricerca su ogni richiesta.