sql >> Databasteknik >  >> RDS >> PostgreSQL

Django och postgresql-scheman

Eftersom Django inte stöder Postgres databasscheman direkt, använd en databasrouter för att få detta att fungera.

Jag skapade en testdatabas för att testa detta med, så här återskapar du den:

Skapa en testdatabas med 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
);

Lägg till scheman till inställningarna som olika databasanslutningar, kom ihåg att lägga till HOST för att undvika felet "Peer-autentisering misslyckades".

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

}

Skapa sedan 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'

Skapa en databasrouter för att dirigera alla exempelrelaterade frågor till exempeldatabasen:

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

I princip dirigerar routern alla modeller som anges i ROUTED_MODELS till databasanslutningen samples och returnera Ingen för alla andra modeller. Detta kommer att dirigera dem till default databasanslutning.

Lägg slutligen till routern i din settings.py

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

Och nu när du gör en fråga för MySample modell kommer den att hämta data från samples schema.



  1. ORA-12505, TNS:listener känner för närvarande inte till SID som ges i anslutningsbeskrivningen

  2. Slå samman en tabell och en ändringslogg till en vy i PostgreSQL

  3. Hur man ändrar kolumndatatyp från tecken till numerisk i PostgreSQL 8.4

  4. MySQL matematiska funktioner (fullständig lista)