PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Schemi Django e postgresql

Poiché Django non supporta gli schemi di database Postgres pronti all'uso, per farlo funzionare, usa un router di database.

Ho creato un database di prova con cui provarlo, ecco come riprodurlo:

Crea un database di test 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
);

Aggiungi gli schemi alle impostazioni come diverse connessioni al database, ricorda di aggiungere HOST per evitare l'errore "Autenticazione peer non riuscita".

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

}

Quindi crea il MySample modello:

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'

Crea un router di database per indirizzare tutte le query relative ai campioni al database di esempio:

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

Fondamentalmente, il router indirizzerà tutti i modelli specificati in ROUTED_MODELS alla connessione al database samples e restituisci Nessuno per tutti gli altri modelli. Questo li indirizzerà al default connessione al database.

Infine aggiungi il router al tuo settings.py

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

E ora quando si esegue una query per MySample modello, recupererà i dati dai samples schema.