【问题标题】:Different schemas containing same tables names包含相同表名的不同模式
【发布时间】:2013-12-19 16:03:12
【问题描述】:

我发现自己有一个 django 项目,它处理映射在相似表名上的两个不同类:

class BarA(models.Model):
[...]
class Meta:
    db_table = 'bar' # doesn't specify any schema

class BarB(models.Model):
[...]
class Meta:
    db_table = u'foo"."bar'

该项目正在使用包含两个架构的数据库:publicfoo

这个应用程序的模板化和部署方式让事情变得更加混乱:在某些服务器上,django 使用用户“John”连接到数据库,而不是任何角色的成员,但在其他服务器上它连接到用户“Eric”, foo 角色的成员。

这里有两个问题:

  1. 如果django's meta class 没有提到任何特定的架构,Postgres 如何决定它将使用哪个表?到目前为止,用户 Eric 似乎总是会点击 foo.bar 表,而不是 public.bar 表,无论调用的类如何。 对于用户“John”,我只使用 BarA 类,它正确地命中了 public.bar
  2. Django 似乎不处理模式;对于这种情况,this solution 是否被认为是一种好的做法(请注意,我无法重命名现有表)?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    在 postgres search_path variable 中设置为表选择架构的优先级:

    搜索路径(字符串)
    此变量指定顺序 当对象(表、数据类型、函数等)被搜索时,模式被搜索 由未指定架构的简单名称引用。当有 是不同模式中具有相同名称的对象,找到的对象 使用搜索路径中的第一个。
    [...]
    搜索路径的当前有效值可以通过SQL函数current_schemas查看。

    一个快速的方法:

    SELECT current_schemas(True);
    

    您可以在第 5.7.3 节中找到有关如何管理 search_path 的详细信息。本文作者:http://www.postgresql.org/docs/current/static/ddl-schemas.html

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2020-03-30
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多