Étant donné que Django ne prend pas en charge les schémas de base de données Postgres prêts à l'emploi, pour que cela fonctionne, utilisez un routeur de base de données.
J'ai créé une base de données de test pour essayer cela, voici comment le reproduire :
Créez une base de données de test avec 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
);
Ajoutez les schémas aux paramètres en tant que différentes connexions à la base de données, n'oubliez pas d'ajouter HOST
pour éviter l'erreur "Échec de l'authentification par le pair".
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'
},
}
Créez ensuite le MySample
modèle :
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'
Créez un routeur de base de données pour diriger toutes les requêtes liées aux exemples vers l'exemple de base de données :
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
Fondamentalement, le routeur acheminera tous les modèles spécifiés dans ROUTED_MODELS vers la connexion à la base de données samples
et renvoyez None pour tous les autres modèles. Cela les acheminera vers le default
connexion à la base de données.
Ajoutez enfin le routeur à votre settings.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
Et maintenant, lorsque vous effectuez une requête pour le MySample
model, il récupérera les données des samples
schéma.