PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Esquemas Django e Postgresql


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.