2012-06-15 7 views
9

Ho sviluppato un'applicazione che utilizza postgresql e funziona bene.utilizzando schemi in postgresql

Ora ho bisogno di creare diverse istanze della stessa applicazione ma ho solo un database. Quindi sto pensando di usare gli schemi, in modo da poter raggruppare ogni tabella di istanza in uno schema diverso.

Ora, non vorrei riscrivere tutte le mie funzioni e script, quindi mi chiedo se posso semplicemente usare alcune direttive per istruire il database a operare su uno schema specifico. Proprio per cercare di renderlo più chiaro, sai quando in C++ che fai

using namespace std; 

in modo che è possibile utilizzare al posto di coutstd::cout? Mi piacerebbe usare qualcosa di simile, se possibile.

+2

Negli script SQL è possibile utilizzare 'set schema 'schemaname';' e tutti i nomi di tabella/vista non qualificati faranno riferimento allo schema 'schemaname'. Vedi http://www.postgresql.org/docs/9.1/static/sql-set.html. –

+0

sai se posso usarlo anche con python psycopg? E influisce solo sulla connessione corrente o anche su quelle che potrebbero funzionare con il database? –

+2

'imposta il nome dello schema di sessione ', in base ai documenti" Specifica che il comando ha effetto per la sessione corrente. (Questo è l'impostazione predefinita se non viene visualizzata SESSIONE né LOCALE.) ". Non posso dirti ora se funziona per psycopg - probabilmente sì. –

risposta

14

Il parametro che si sta cercando è search_path - che elenca gli schemi di una query sarà in Quindi, si può fare qualcosa di simile:.

CREATE TABLE schema1.tt ... 
CREATE TABLE schema2.tt ... 
CREATE FUNCTION schema1.foo() ... 
CREATE FUNCTION schema2.foo() ... 
SET search_path = schema1, something_else; 
SELECT * FROM tt;  -- schema1.tt 
SELECT * FROM schema2.tt -- schema2.tt 
SELECT foo();   -- calls schema1.foo 
SELECT schema2.foo(); -- calls schema2.foo 

Nota che se il piano di una query viene salvato all'interno del corpo di pippo() quindi potresti ottenere risultati imprevisti. Ti consigliamo di elencare sempre gli schemi per le tabelle di riferimento nelle funzioni di plpgsql se stai utilizzando tabelle duplicate. In caso contrario, assicurati di aver eseguito test in loco per verificare il comportamento con un percorso di ricerca chaning.

Oh, è possibile impostare in modo esplicito search_path anche per il corpo di una funzione: consultare il riferimento CREATE FUNCTION del manuale per i dettagli.