sql >> Database >  >> RDS >> PostgreSQL

Django- en postgresql-schema's

Omdat Django standaard Postgres-databaseschema's niet ondersteunt, moet u een databaserouter gebruiken om dit te laten werken.

Ik heb een testdatabase gemaakt om dit uit te proberen, hier is hoe het te reproduceren:

Maak een testdatabase met 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
);

Voeg de schema's toe aan de instellingen als verschillende databaseverbindingen, vergeet niet om HOST toe te voegen om de fout "Peer-authenticatie mislukt" te voorkomen.

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

}

Maak vervolgens de MySample model:

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'

Maak een databaserouter om alle voorbeeldgerelateerde vragen naar de voorbeelddatabase te leiden:

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

In principe zal de router alle modellen die zijn gespecificeerd in ROUTED_MODELS doorsturen naar de databaseverbinding samples en retourneer Geen voor alle andere modellen. Dit leidt ze naar de default databaseverbinding.

Voeg ten slotte de router toe aan uw settings.py

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

En nu bij het uitvoeren van een query voor de MySample model, haalt het gegevens op uit de samples schema.



  1. SQLite COUNT

  2. MySQL JDBC-stuurprogramma 5.1.33 - Tijdzoneprobleem

  3. Tabel gewaardeerde functies in ORACLE 11g? (geparametriseerde weergaven)

  4. Toegang tot mysql externe database vanaf de opdrachtregel