【问题标题】:using schemas in postgresql在 postgresql 中使用模式
【发布时间】:2012-06-15 07:11:42
【问题描述】:

我使用 postgresql 开发了一个应用程序,它运行良好。

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

现在,我不想重写我所有的函数和脚本,因此我想知道是否可以使用一些指令来指示数据库在特定模式上操作。只是为了让它更清楚,你知道你什么时候在 c++ 中这样做

using namespace std;

这样您就可以使用 cout 而不是 std::cout 吗?如果可能的话,我想使用类似的东西。

【问题讨论】:

  • 在 SQL 脚本中,您可以使用 set schema 'schemaname'; 并且所有不合格的表/视图名称将引用 schemaname 架构。见postgresql.org/docs/9.1/static/sql-set.html
  • 你知道我是否也可以将它与 python psycopg 一起使用吗?它是否只影响当前连接或可能与数据库一起操作的其他连接?
  • set session schema 'name',根据文档“指定命令对当前会话生效。(如果 SESSION 和 LOCAL 均未出现,则这是默认设置。)”。我现在不能告诉你它是否适用于 psycopg - 可能是的。

标签: postgresql database-schema


【解决方案1】:

您要查找的参数是 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 函数中引用表的模式。如果没有,请确保您已进行适当的测试,以检查使用不断变化的 search_path 的行为。

哦 - 您也可以为函数的主体显式设置 search_path - 有关详细信息,请参阅手册的 CREATE FUNCTION 参考。

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 2012-02-07
    • 1970-01-01
    • 2016-11-16
    • 2013-08-21
    • 2017-10-10
    • 1970-01-01
    • 2017-05-18
    • 2019-06-09
    相关资源
    最近更新 更多