sql >> Base de Datos >  >> RDS >> PostgreSQL

Esquemas de Django y postgresql

Debido a que Django no es compatible con los esquemas de base de datos Postgres listos para usar, para que esto funcione, use un enrutador de base de datos.

Creé una base de datos de prueba para probar esto, así es como se reproduce:

Cree una base de datos de prueba con 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
);

Agregue los esquemas a la configuración como diferentes conexiones de base de datos, recuerde agregar HOST para evitar el error "Falló la autenticación de pares".

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'
},

A continuación, cree el 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'

Cree un enrutador de base de datos para dirigir todas las consultas relacionadas con muestras a la base de datos de muestras:

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

Básicamente, el enrutador enrutará todos los modelos especificados en ROUTED_MODELS a la conexión de base de datos samples y devuelva Ninguno para todos los demás modelos. Esto los enrutará al default conexión a la base de datos.

Finalmente agregue el enrutador a su configuración.py

DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)

Y ahora al hacer una consulta para MySample modelo, obtendrá datos de las samples esquema.