Skemaer bruges ikke i mange andre DB-motorer. Ved at angive et skema i dine modeller har du indført en afhængighed i din kode for postgres.
Der er to veje, du kan tage for at løse dit problem;
Først kan du tilføje en standardsøgesti til din postgres-bruger. Ulempen ved denne tilgang er, at skemaer ikke længere kan bruges til navneafstand, men fordelen er, at hvis din database nogensinde skifter til en anden motor, vil din kode fungere fint. Navneafstand til dine tabeller kan opnås ved at vælge en standard måde at navngive dine tabeller på, på samme måde som Django gør det som standard (f.eks. appName_className)
Der er to måder at opnå dette på. Postgres-kommandoen til at gøre det på denne måde er:
ALTER USER (your user) SET search_path = "$user",(schema1),(schema2),(schema3),(...)
Den eneste måde at gøre det på for django er:
# 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'
}
}
}
Du vil også gerne ændre:
db_table = 'cedirData\".\"persons'
til:
db_table = 'persons'
Som en bonus kan du nu bruge:
manage.py inspectdb > models.py
hvilket er en fin funktion, på den måde behøver du ikke kopiere din eksisterende database i hånden.
Denne løsning vil dog ikke hjælpe dig, hvis skemanavneafstand blev brugt meget på din database, og andre programmer er afhængige af det. En anden tilgang ville være at skrive en brugerdefineret testrunner for at oprette disse skemaer i din testdatabase. Dette er noget mere involveret end ovenstående tilgang og kan være noget rodet. Jeg anbefaler egentlig ikke at gøre dette, men hvis du er interesseret, kan jeg prøve at hjælpe.
En mindre rodet, men mere 'hacky' måde ville være blot at tilsidesætte meta, når der køres test. Dette ville også være en testrunner.
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]
Du vil også gerne definere dette som en testrunner i filen settings.py.