Skema tidak digunakan di banyak mesin DB lainnya. Dengan menentukan skema dalam model Anda, Anda telah memperkenalkan ketergantungan pada kode Anda untuk postgres.
Ada dua rute yang dapat Anda ambil untuk menyelesaikan masalah Anda;
Pertama, Anda dapat menambahkan jalur pencarian default ke pengguna postgres Anda. Kerugian dari pendekatan ini adalah bahwa skema tidak lagi dapat digunakan untuk penspasian nama, tetapi keuntungannya adalah jika database Anda pernah berubah ke mesin yang berbeda, kode Anda akan berfungsi dengan baik. Penspasian nama tabel Anda dapat dicapai dengan memilih beberapa cara standar penamaan tabel Anda, mirip dengan cara Django melakukannya secara default (misalnya appName_className)
Ada dua cara untuk mencapai ini. Perintah postgres untuk melakukannya dengan cara ini adalah:
ALTER USER (your user) SET search_path = "$user",(schema1),(schema2),(schema3),(...)
Cara satu-satunya Django untuk melakukannya adalah:
# Warning! This is untested, I just glanced at the docs and it looks right.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
# some configuration here
'OPTIONS': {
'options': '-c search_path=schema1,schema2,schema3'
}
}
}
Anda juga ingin mengubah:
db_table = 'cedirData\".\"persons'
ke:
db_table = 'persons'
Sebagai bonus, sekarang Anda dapat menggunakan:
manage.py inspectdb > models.py
yang merupakan fitur bagus, sehingga Anda tidak perlu menyalin database yang ada secara manual.
Namun, solusi ini tidak akan membantu Anda, jika penspasian nama skema banyak digunakan pada database Anda dan aplikasi lain bergantung padanya. Pendekatan yang berbeda adalah dengan menulis testrunner khusus untuk membuat skema tersebut di database pengujian Anda. Ini agak lebih terlibat daripada pendekatan di atas, dan bisa agak berantakan. Saya tidak merekomendasikan melakukan ini, tetapi jika Anda tertarik, saya dapat mencoba membantu.
Cara yang tidak terlalu berantakan, tetapi lebih 'retas' adalah dengan mengganti meta saat pengujian dijalankan. Ini juga akan menjadi ujian.
from django.test.simple import DjangoTestSuiteRunner
from django.db.models.loading import get_models
class SchemaModelTestRunner(DjangoTestSuiteRunner):
"""Docstring"""
def setup_test_environment(self, *args, **kwargs):
self.original_db_tables = {}
self.schema_models = [m for m in get_models()
if '"."' in m._meta.db_table]
for m in self.schema_models:
schema, table = m._meta.db_table.split('"."')
self.original_db_tables[m] = m._meta.db_table
m._meta.db_table = 'schema_'+schema+'_table_'+table
super(SchemaModelTestRunner, self).setup_test_environment(*args,
**kwargs)
def teardown_test_environment(self, *args, **kwargs):
super(SchemaModelTestRunner, self).teardown_test_environment(*args,
**kwargs)
# reset models
for m in self.schema_models:
m._meta.db_table = self.original_db_tables[m]
Anda juga ingin mendefinisikan ini sebagai testrunner di file settings.py Anda.