Eftersom Django inte stöder Postgres databasscheman direkt, använd en databasrouter för att få detta att fungera.
Jag skapade en testdatabas för att testa detta med, så här återskapar du den:
Skapa en testdatabas med 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
);
Lägg till scheman till inställningarna som olika databasanslutningar, kom ihåg att lägga till HOST
för att undvika felet "Peer-autentisering misslyckades".
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'
},
}
Skapa sedan MySample
modell:
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'
Skapa en databasrouter för att dirigera alla exempelrelaterade frågor till exempeldatabasen:
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
I princip dirigerar routern alla modeller som anges i ROUTED_MODELS till databasanslutningen samples
och returnera Ingen för alla andra modeller. Detta kommer att dirigera dem till default
databasanslutning.
Lägg slutligen till routern i din settings.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
Och nu när du gör en fråga för MySample
modell kommer den att hämta data från samples
schema.