Djangoはすぐに使用できるPostgresデータベーススキーマをサポートしていないため、これを機能させるには、データベースルーターを使用してください。
これを試すためのテストデータベースを作成しました。これを再現する方法は次のとおりです。
psqlを使用してテストデータベースを作成します:
CREATE USER tester WITH PASSWORD 'lol so easy';
CREATE DATABASE multi_schema_db WITH OWNER tester;
CREATE SCHEMA samples AUTHORIZATION tester;
CREATE TABLE samples.my_samples (
id INTEGER NOT NULL PRIMARY KEY,
description CHAR(255) NOT NULL
);
スキーマを別のデータベース接続として設定に追加します。HOST
を追加することを忘れないでください 「ピア認証に失敗しました」エラーを回避するため。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=django,public'
},
'NAME': 'multi_schema_db',
'USER': 'tester',
'PASSWORD': 'lol so easy',
'HOST': 'localhost'
},
'samples': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=samples,public'
},
'NAME': 'multi_schema_db',
'USER': 'tester',
'PASSWORD': 'lol so easy',
'HOST': 'localhost'
},
}
次に、MySample
を作成します モデル:
from django.db import models
class MySample(models.Model):
description = models.CharField(max_length=255, null=False)
class Meta:
managed = False
db_table = 'my_samples'
データベースルーターを作成して、サンプル関連のすべてのクエリをサンプルデータベースに送信します。
from database_test.models import MySample
ROUTED_MODELS = [MySample]
class MyDBRouter(object):
def db_for_read(self, model, **hints):
if model in ROUTED_MODELS:
return 'samples'
return None
def db_for_write(self, model, **hints):
if model in ROUTED_MODELS:
return 'samples'
return None
基本的に、ルーターはROUTED_MODELSで指定されたすべてのモデルをデータベース接続のsamples
にルーティングします。 他のすべてのモデルについてはNoneを返します。これにより、それらがdefault
にルーティングされます データベース接続。
最後に、ルーターをsettings.pyに追加します
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
そして今、MySample
のクエリを実行するとき モデルの場合、samples
からデータをフェッチします スキーマ。