【问题标题】:How to connect to multiple PostgreSQL schemas from Django?如何从 Django 连接到多个 PostgreSQL 模式?
【发布时间】:2015-10-21 22:42:14
【问题描述】:

在我的 GeoDjango 项目中,我想连接到旧版 PostgreSQL/PostGIS 数据库。它包含以下架构:

  • data // 包含所有地理空间数据
  • django // 空的,由我创建
  • public //系统表如spatial_ref_sys

我希望屏幕截图中显示的 Django 表进入 django 模式。我不想污染public 架构。

我希望“数据”模型连接到 data 架构。我已经尝试generate models from the legacy tablespython manage.py inspectdb 连接到public 架构。


为了提供对不同架构的访问,我调整了 approach 2 of this article,它将单个 search_path 值预分配给特定数据库用户:

-- user accessing django schema...
CREATE ROLE django_user LOGIN PASSWORD 'secret';
ALTER ROLE django_user SET search_path TO django, public;

-- user accessing data schema...
CREATE ROLE data_user LOGIN PASSWORD 'secret';
ALTER ROLE data_user SET search_path TO data, public;

然后我配置数据库连接如下:

DATABASES = {

    'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'multi_schema_db',
            'USER': 'django_user',
            'PASSWORD': 'secret',
    },

    'data': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'multi_schema_db',
            'USER': 'data_user',
            'PASSWORD': 'secret',
    },
}

如何实际配置 Django 使用 django 架构,而“数据”模型连接到 data 架构?


读数

【问题讨论】:

  • @falsetru 自动数据库路由器的文档没有提到如何处理一个数据库中的多个模式。
  • @JJD 你找到这个问题的答案了吗?谢谢!
  • @AbzRockers 只有您可以阅读的内容here
  • @JJD 感谢您的回复!我认为如果它解决了您的问题,您应该将其标记为正确答案,我忽略了这个问题的答案,因为它没有标记正确答案,也没有投票。

标签: django postgresql database-schema postgis geodjango


【解决方案1】:

如果您不需要通过迁移来管理表,您可以为模型的 db_table 属性使用 转义引号

class SomeModel(models.Model):
    field1 = models.AutoField(primary_key=True)  
    class Meta():
        managed=False
        db_table=u'"schema\".\"table"'

【讨论】:

  • 这对我有用。您也可以简单地使用没有转义引号。 db_table='schema"."table'
  • 这很棒,据我所知,它也适用于迁移!
  • 对我不起作用,也没有引号
【解决方案2】:

您必须利用search_path

DATABASES = {

    'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'OPTIONS' : {
                'options': '-c search_path=django,public'
            },
            'NAME': 'multi_schema_db',
            'USER': 'django_user',
            'PASSWORD': 'secret',
    },

    'data': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'OPTIONS' : {
                'options': '-c search_path=data,public'
            },
            'NAME': 'multi_schema_db',
            'USER': 'data_user',
            'PASSWORD': 'secret',
    },
}

【讨论】:

    【解决方案3】:

    我们使用Django Tenant Schemas 取得了巨大成功。它允许您通过将不同的租户描述为架构的所有者来访问不同的架构。

    这将允许您在每次调用的基础上设置架构。如果需要基于每个 url 设置架构,您可以在中间件中进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多