包含相同表名的不同模式

时间:2013-12-03 14:28:37

标签: django postgresql

我发现自己有一个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被认为是这种情况的好习惯(请注意我不能重命名现有的表格)?

1 个答案:

答案 0 :(得分:1)

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

  

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

快速执行此操作:

SELECT current_schemas(True);

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