Poiché Django non supporta gli schemi di database Postgres pronti all'uso, per farlo funzionare, usa un router di database.
Ho creato un database di prova con cui provarlo, ecco come riprodurlo:
Crea un database di test con 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
);
Aggiungi gli schemi alle impostazioni come diverse connessioni al database, ricorda di aggiungere HOST
per evitare l'errore "Autenticazione peer non riuscita".
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'
},
}
Quindi crea il MySample
modello:
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'
Crea un router di database per indirizzare tutte le query relative ai campioni al database di esempio:
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
Fondamentalmente, il router indirizzerà tutti i modelli specificati in ROUTED_MODELS alla connessione al database samples
e restituisci Nessuno per tutti gli altri modelli. Questo li indirizzerà al default
connessione al database.
Infine aggiungi il router al tuo settings.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
E ora quando si esegue una query per MySample
modello, recupererà i dati dai samples
schema.