2012-06-15 26 views
9

我开发了一个使用postgresql的应用程序,它运行良好。在postgresql中使用模式

现在我需要创建同一个应用程序的多个实例,但我只有一个数据库。所以我正在考虑使用模式,以便我可以将每个实例表分组在不同的模式中。

现在,我不想重写所有的函数和脚本,因此我想知道是否可以使用某个指令来指示数据库在特定模式上运行。只是为了尝试,使其更清晰,你知道在C++时你做

using namespace std; 

,这样就可以使用cout代替std::cout?我想尽可能使用类似的东西。

+2

在SQL脚本中,您可以使用'set schema'schemaname';'并且所有不合格的表/视图名称将引用'schemaname'模式。请参阅http://www.postgresql.org/docs/9.1/static/sql-set.html。 –

+0

你知道我是否也可以用python psycopg来使用它吗?它只会影响当前的连接或其他可能与数据库一起工作的连接吗? –

+2

'set session schema'name'',根据docs“指定命令对当前会话生效(如果SESSION和LOCAL都不出现,这是默认值)。”。我现在不能告诉你它是否适用于psycopg - 可能是的。 –

回答

14

你正在寻找的参数是search_path - 列出了架构的查询将查找所以,你可以这样做:

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 

注意,如果查询的计划被保存的体内foo(),那么你可能会得到意想不到的结果。如果您使用重复表,我建议您总是明确列出plpgsql函数中引用表的模式。如果没有,请确保您有适当的测试来检查chaning search_path的行为。

噢 - 你也可以为函数的主体显式地设置search_path - 详见手册的CREATE FUNCTION参考。