Omdat Django standaard Postgres-databaseschema's niet ondersteunt, moet u een databaserouter gebruiken om dit te laten werken.
Ik heb een testdatabase gemaakt om dit uit te proberen, hier is hoe het te reproduceren:
Maak een testdatabase met 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
);
Voeg de schema's toe aan de instellingen als verschillende databaseverbindingen, vergeet niet om HOST
toe te voegen om de fout "Peer-authenticatie mislukt" te voorkomen.
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'
},
}
Maak vervolgens de 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'
Maak een databaserouter om alle voorbeeldgerelateerde vragen naar de voorbeelddatabase te leiden:
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
In principe zal de router alle modellen die zijn gespecificeerd in ROUTED_MODELS doorsturen naar de databaseverbinding samples
en retourneer Geen voor alle andere modellen. Dit leidt ze naar de default
databaseverbinding.
Voeg ten slotte de router toe aan uw settings.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
En nu bij het uitvoeren van een query voor de MySample
model, haalt het gegevens op uit de samples
schema.