Como o Django não suporta esquemas de banco de dados Postgres prontos para uso, para que isso funcione, use um roteador de banco de dados.
Eu criei um banco de dados de teste para testar isso, veja como reproduzi-lo:
Crie um banco de dados de teste com 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
);
Adicione os esquemas às configurações como diferentes conexões de banco de dados, lembre-se de adicionar
HOST
para evitar o erro "Falha na autenticação de mesmo nível". 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'
},
}
Em seguida, crie o
MySample
modelo: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'
Crie um roteador de banco de dados para direcionar todas as consultas relacionadas à amostra para o banco de dados de amostra:
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
Basicamente, o roteador roteará todos os modelos especificados em ROUTED_MODELS para a conexão do banco de dados
samples
e retorne Nenhum para todos os outros modelos. Isso irá encaminhá-los para o default
conexão de banco de dados. Por fim, adicione o roteador ao seu settings.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
E agora ao fazer uma consulta para o
MySample
model, ele buscará dados das samples
esquema.