私のGeoDjangoプロジェクトでは、レガシーPostgreSQL/PostGISデータベースに接続したいと思います。次のスキーマが含まれています。
spatial_ref_sys
などのシステムテーブルスクリーンショットに示されているDjangoテーブルをDjango
スキーマに入れたい。public
スキーマを汚染したくない。
「データ」モデルをdata
スキーマに接続したい。私はすでに レガシーテーブルからモデルを生成する を試みましたが、python manage.py inspectdb
はpublic
スキーマに接続します。
さまざまなスキーマへのアクセスを提供するために、特定のデータベースユーザーに個々の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
スキーマを使用するように実際に構成するにはどうすればよいですか?
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',
},
}
移行によってテーブルを管理する必要がない場合は、モデルのdb_table
属性にエスケープされた引用符を使用できます。
class SomeModel(models.Model):
field1 = models.AutoField(primary_key=True)
class Meta():
managed=False
db_table=u'"schema\".\"table"'
Django Tenant Schemas を使用して大成功を収めました。スキーマの所有者としてさまざまなテナントを描くことにより、さまざまなスキーマにアクセスできます。
これにより、呼び出しごとにスキーマを設定できます。スキーマをURLごとに設定する必要がある場合は、ミドルウェアで設定できます。