Karena Django tidak mendukung skema basis data Postgres di luar kotak, untuk membuatnya bekerja, gunakan perute basis data.
Saya membuat database pengujian untuk mencobanya, berikut cara mereproduksinya:
Buat database pengujian dengan 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
);
Tambahkan skema ke pengaturan sebagai koneksi database yang berbeda, ingatlah untuk menambahkan HOST
untuk menghindari kesalahan “otentikasi rekan gagal”.
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'
},
}
Selanjutnya buat 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'
Buat router database untuk mengarahkan semua kueri terkait sampel ke database sampel:
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
Pada dasarnya, router akan merutekan semua model yang ditentukan dalam ROUTED_MODELS ke koneksi database samples
dan kembalikan None untuk semua model lainnya. Ini akan mengarahkan mereka ke default
koneksi basis data.
Terakhir tambahkan router ke settings.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
Dan sekarang saat melakukan kueri untuk MySample
model, itu akan mengambil data dari samples
skema.