Схемите не се използват в много други DB машини. Като посочите схема във вашите модели, вие сте въвели зависимост във вашия код за postgres.
Има два начина, по които можете да решите проблема си;
Първо, можете да добавите път за търсене по подразбиране към вашия потребител на postgres. Недостатъкът на този подход е, че схемите вече не могат да се използват за пространство на имената, но предимството е, че ако вашата база данни някога се промени на различен двигател, вашият код ще функционира добре. Разпределението на имената на вашите таблици може да бъде постигнато чрез избор на някакъв стандартен начин за именуване на вашите таблици, подобно на начина, по който Django го прави по подразбиране (напр. appName_className)
Има два начина да постигнете това. Командата на postgres, за да го направите по този начин, е:
ALTER USER (your user) SET search_path = "$user",(schema1),(schema2),(schema3),(...)
Начинът само за django да го направите е:
# 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'
}
}
}
Също така ще искате да промените:
db_table = 'cedirData\".\"persons'
до:
db_table = 'persons'
Като бонус вече можете да използвате:
manage.py inspectdb > models.py
което е хубава функция, така че не е необходимо да копирате на ръка съществуващата си база данни.
Това решение обаче няма да ви помогне, ако пространството на имената на схемата е било използвано силно във вашата база данни и други приложения разчитат на него. Друг подход би бил да напишете персонализиран тестов инструмент за създаване на тези схеми във вашата тестова база данни. Това е малко по-ангажиращо от горния подход и може да бъде доста объркващо. Наистина не препоръчвам да правите това, но ако се интересувате, мога да се опитам да помогна.
По-малко разхвърлян, но по-„хакерски“ начин би бил просто да замените meta, когато се изпълняват тестове. Това също ще бъде програма за тестване.
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]
Също така ще искате да дефинирате това като тестов инструмент във вашия файл settings.py.