Da Django keine Postgres-Datenbankschemas standardmäßig unterstützt, verwenden Sie einen Datenbankrouter, damit dies funktioniert.
Ich habe eine Testdatenbank erstellt, um dies auszuprobieren, hier ist, wie man es reproduziert:
Erstellen Sie eine Testdatenbank mit 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
);
Fügen Sie die Schemata als unterschiedliche Datenbankverbindungen zu den Einstellungen hinzu, denken Sie daran, HOST
hinzuzufügen um den Fehler „Peer-Authentifizierung fehlgeschlagen“ zu vermeiden.
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'
},
}
Als nächstes erstellen Sie 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'
Erstellen Sie einen Datenbank-Router, um alle probenbezogenen Abfragen an die Probendatenbank zu leiten:
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
Grundsätzlich leitet der Router alle in ROUTED_MODELS angegebenen Modelle an die Datenbankverbindung samples
und geben Sie None für alle anderen Modelle zurück. Dadurch werden sie zum default
geleitet Datenbankverbindung.
Fügen Sie abschließend den Router zu Ihrer settings.py
hinzuDATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
Und jetzt, wenn Sie eine Abfrage für MySample
durchführen model, ruft es Daten aus den samples
ab Schema.