web-dev-qa-db-ja.com

Djangoから複数のPostgreSQLスキーマに接続するにはどうすればよいですか?

私のGeoDjangoプロジェクトでは、レガシーPostgreSQL/PostGISデータベースに接続したいと思います。次のスキーマが含まれています。

  • data //すべての地理空間データが含まれています
  • Django //空、私が作成
  • public // spatial_ref_sysなどのシステムテーブル

スクリーンショットに示されているDjangoテーブルをDjangoスキーマに入れたい。publicスキーマを汚染したくない。

Django tables

「データ」モデルをdataスキーマに接続したい。私はすでに レガシーテーブルからモデルを生成する を試みましたが、python manage.py inspectdbpublicスキーマに接続します。


さまざまなスキーマへのアクセスを提供するために、特定のデータベースユーザーに個々のsearch_path値を事前に割り当てる この記事のアプローチ2 を採用しました。

-- 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スキーマを使用するように実際に構成するにはどうすればよいですか?


読み値

11
JJD

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',
    },
}
7
JJD

移行によってテーブルを管理する必要がない場合は、モデルのdb_table属性にエスケープされた引用符を使用できます。

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

Django Tenant Schemas を使用して大成功を収めました。スキーマの所有者としてさまざまなテナントを描くことにより、さまざまなスキーマにアクセスできます。

これにより、呼び出しごとにスキーマを設定できます。スキーマをURLごとに設定する必要がある場合は、ミドルウェアで設定できます。

1
Incognos