Bởi vì Django không hỗ trợ lược đồ cơ sở dữ liệu Postgres, nên để làm cho điều này hoạt động, hãy sử dụng bộ định tuyến cơ sở dữ liệu.
Tôi đã tạo một cơ sở dữ liệu thử nghiệm để dùng thử điều này, sau đây là cách tạo lại nó:
Tạo cơ sở dữ liệu thử nghiệm với 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
);
Thêm các lược đồ vào cài đặt dưới dạng các kết nối cơ sở dữ liệu khác nhau, hãy nhớ thêm HOST
để tránh lỗi "Xác thực ngang hàng không thành công".
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'
},
}
Tiếp theo, tạo MySample
mô hình:
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'
Tạo bộ định tuyến cơ sở dữ liệu để hướng tất cả các truy vấn liên quan đến mẫu đến cơ sở dữ liệu mẫu:
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
Về cơ bản, bộ định tuyến sẽ định tuyến tất cả các mô hình được chỉ định trong ROUTED_MODELS đến kết nối cơ sở dữ liệu samples
và trả về Không có cho tất cả các mô hình khác. Điều này sẽ định tuyến chúng đến default
kết nối cơ sở dữ liệu.
Cuối cùng, thêm bộ định tuyến vào settings.py
của bạnDATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
Và bây giờ khi thực hiện truy vấn cho MySample
mô hình, nó sẽ tìm nạp dữ liệu từ samples
lược đồ.