Ponieważ Django nie obsługuje schematów baz danych Postgres po wyjęciu z pudełka, aby to zadziałało, użyj routera bazy danych.
Stworzyłem testową bazę danych, aby to wypróbować, oto jak ją odtworzyć:
Utwórz testową bazę danych za pomocą 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
);
Dodaj schematy do ustawień jako różne połączenia z bazą danych, pamiętaj, aby dodać HOST
aby uniknąć błędu „Uwierzytelnianie równorzędne nie powiodło się”.
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'
},
}
Następnie utwórz 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'
Utwórz router bazy danych, aby kierować wszystkie zapytania związane z próbkami do przykładowej bazy danych:
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
Zasadniczo router skieruje wszystkie modele określone w ROUTED_MODELS do połączenia z bazą danych samples
i zwróć Brak dla wszystkich pozostałych modeli. To przekieruje je do default
połączenie z bazą danych.
Na koniec dodaj router do ustawień.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
A teraz, gdy wykonujesz zapytanie dla MySample
model, pobierze dane z samples
schemat.