PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Django- und postgresql-Schemas

Da Django keine Postgres-Datenbankschemas standardmäßig unterstützt, verwenden Sie einen Datenbankrouter, damit dies funktioniert.

Ich habe eine Testdatenbank erstellt, um dies auszuprobieren, hier ist, wie man es reproduziert:

Erstellen Sie eine Testdatenbank mit 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
);

Fügen Sie die Schemata als unterschiedliche Datenbankverbindungen zu den Einstellungen hinzu, denken Sie daran, HOST hinzuzufügen um den Fehler „Peer-Authentifizierung fehlgeschlagen“ zu vermeiden.

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

}

Als nächstes erstellen Sie MySample Modell:

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'

Erstellen Sie einen Datenbank-Router, um alle probenbezogenen Abfragen an die Probendatenbank zu leiten:

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

Grundsätzlich leitet der Router alle in ROUTED_MODELS angegebenen Modelle an die Datenbankverbindung samples und geben Sie None für alle anderen Modelle zurück. Dadurch werden sie zum default geleitet Datenbankverbindung.

Fügen Sie abschließend den Router zu Ihrer settings.py

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

Und jetzt, wenn Sie eine Abfrage für MySample durchführen model, ruft es Daten aus den samples ab Schema.