我发现自己正在使用一个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的元课 没有提及任何特定的模式, Postgres如何决定将使用哪个表 ?到目前为止,看来用户ERIC总是会击中 foo.bar 桌子,从不 public.bar 一个,无论被称为班级。与用户“约翰”,我只使用 BarA 上课,它正确地打了 public.bar.
  2. Django似乎没有处理模式;是 这个解决方案 被认为是这种情况的好做法(请注意,我不能重命名现有表)?
有帮助吗?

解决方案

在Postgres中 search_path 多变的 设置选择表格架构的优先级:

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

一种快速的方法:

SELECT current_schemas(True);

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top