如何从Django连接到多个PostgreSQL架构?

JJD*_*JJD 10 django postgresql postgis geodjango database-schema

在我的GeoDjango项目中,我想连接到传统的PostgreSQL/PostGIS数据库.它包含以下模式:

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

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

Django表

我希望"数据"模型连接到data架构.我已经尝试从遗留表中生成模型,但是python manage.py inspectdb连接到public模式.


为了提供对不同模式的访问,我采用了本文方法2,该方法将单个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;
Run Code Online (Sandbox Code Playgroud)

然后我按如下方式配置了数据库连接:

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',
    },
}
Run Code Online (Sandbox Code Playgroud)

如何django在"数据"模型连接到模式时实际配置Django使用data模式?


阅读

JJD*_*JJD 6

你必须利用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',
    },
}
Run Code Online (Sandbox Code Playgroud)


wbl*_*oos 6

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

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


Sin*_*lil 2

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

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