PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Schémas Django et postgresql

Étant donné que Django ne prend pas en charge les schémas de base de données Postgres prêts à l'emploi, pour que cela fonctionne, utilisez un routeur de base de données.

J'ai créé une base de données de test pour essayer cela, voici comment le reproduire :

Créez une base de données de test avec 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
);

Ajoutez les schémas aux paramètres en tant que différentes connexions à la base de données, n'oubliez pas d'ajouter HOST pour éviter l'erreur "Échec de l'authentification par le pair".

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

}

Créez ensuite le MySample modèle :

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'

Créez un routeur de base de données pour diriger toutes les requêtes liées aux exemples vers l'exemple de base de données :

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

Fondamentalement, le routeur acheminera tous les modèles spécifiés dans ROUTED_MODELS vers la connexion à la base de données samples et renvoyez None pour tous les autres modèles. Cela les acheminera vers le default connexion à la base de données.

Ajoutez enfin le routeur à votre settings.py

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

Et maintenant, lorsque vous effectuez une requête pour le MySample model, il récupérera les données des samples schéma.