2012-06-15 19 views
9

He desarrollado una aplicación que usa postgresql y funciona bien.usando esquemas en postgresql

Ahora necesito crear varias instancias de la misma aplicación pero solo tengo una base de datos. Así que estoy pensando en usar esquemas, de modo que pueda agrupar cada tabla de instancia en un esquema diferente.

Ahora, no me gustaría volver a escribir todas mis funciones y script, por lo tanto, me pregunto si puedo usar alguna directiva para indicar a la base de datos que opere en un esquema específico. Sólo para tratar de hacerlo más claro, sabes cuando en C++ lo hace

using namespace std; 

por lo que se puede utilizar en lugar de coutstd::cout? Me gustaría utilizar algo similar si es posible.

+2

En las secuencias de comandos SQL, puede utilizar 'set schema 'schemaname';' y todos los nombres de tabla/vista no calificados harán referencia al esquema 'schemaname'. Ver http://www.postgresql.org/docs/9.1/static/sql-set.html. –

+0

¿sabes si puedo usarlo también con python psycopg? ¿Y solo afecta la conexión actual o también las otras que pueden operar con la base de datos? –

+2

'establecer esquema de sesión 'nombre'', de acuerdo con los documentos" Especifica que el comando entra en vigencia para la sesión actual. (Este es el valor predeterminado si no aparece SESIÓN ni LOCAL) ". No puedo decirte ahora si funciona para psycopg, probablemente sí. –

Respuesta

14

El parámetro que busca es search_path - que muestra los esquemas de una consulta se verá en tanto, se puede hacer algo como:.

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 

Tenga en cuenta que si el plan de una consulta se guarda dentro del cuerpo de foo() entonces puede obtener resultados inesperados. Le recomendaría que siempre enumere explícitamente esquemas para tablas referenciadas en funciones plpgsql si está utilizando tablas duplicadas. Si no es así, asegúrese de tener las pruebas en su lugar para verificar el comportamiento con un cambio search_path.

Ah, también puede establecer explícitamente search_path para el cuerpo de una función; consulte la referencia CREATE FUNCTION del manual para obtener más información.

Cuestiones relacionadas