Protože Django po vybalení nepodporuje databázová schémata Postgres, použijte databázový router, aby to fungovalo.
Vytvořil jsem testovací databázi, se kterou to mohu vyzkoušet, zde je návod, jak ji reprodukovat:
Vytvořte testovací databázi pomocí 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
);
Přidejte schémata do nastavení jako různá databázová připojení, nezapomeňte přidat HOST
abyste se vyhnuli chybě „Autentizace peer selhala“.
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'
},
}
Dále vytvořte MySample
model:
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'
Vytvořte databázový směrovač, který bude směrovat všechny dotazy související s ukázkou do ukázkové databáze:
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
Router bude v zásadě směrovat všechny modely uvedené v ROUTED_MODELS do databázového připojení samples
a u všech ostatních modelů vrátí Žádné. Tím je nasměrujete na default
připojení k databázi.
Nakonec přidejte router do souboru settings.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
A nyní při zadávání dotazu na MySample
model, načte data ze samples
schéma.