कई अन्य डीबी इंजनों में स्कीमा का उपयोग नहीं किया जाता है। अपने मॉडलों में एक स्कीमा निर्दिष्ट करके, आपने पोस्टग्रेज के लिए अपने कोड में एक निर्भरता का परिचय दिया है।
आप अपनी समस्या का समाधान करने के लिए दो मार्ग अपना सकते हैं;
सबसे पहले, आप अपने पोस्टग्रेज उपयोगकर्ता के लिए एक डिफ़ॉल्ट खोज पथ जोड़ सकते हैं। इस दृष्टिकोण का नुकसान यह है कि स्कीमा का उपयोग अब नेमस्पेसिंग के लिए नहीं किया जा सकता है, लेकिन लाभ यह है कि यदि आपका डेटाबेस कभी भी किसी भिन्न इंजन में बदलता है, तो आपका कोड ठीक काम करेगा। अपनी तालिकाओं के नामकरण के कुछ मानक तरीके को चुनकर अपनी तालिकाओं को नेमस्पेसिंग प्राप्त किया जा सकता है, ठीक उसी तरह जैसे कि Django इसे डिफ़ॉल्ट रूप से करता है (जैसे appName_className)
इसे हासिल करने के दो तरीके हैं। इसे इस तरह से करने के लिए पोस्टग्रेज कमांड है:
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
जो एक अच्छी सुविधा है, इस तरह आपको अपने मौजूदा डेटाबेस को हाथ से कॉपी करने की आवश्यकता नहीं है।
हालांकि, यह समाधान आपकी मदद नहीं करेगा, यदि आपके डेटाबेस पर स्कीमा नेमस्पेसिंग का भारी उपयोग किया गया था और अन्य एप्लिकेशन इस पर भरोसा करते हैं। अपने परीक्षण डेटाबेस में उन स्कीमाओं को बनाने के लिए एक कस्टम टेस्टरनर लिखना एक अलग तरीका होगा। यह उपरोक्त दृष्टिकोण की तुलना में कुछ अधिक शामिल है, और एक प्रकार का गड़बड़ हो सकता है। मैं वास्तव में ऐसा करने की अनुशंसा नहीं करता, लेकिन यदि आप रुचि रखते हैं तो मैं मदद करने की कोशिश कर सकता हूं।
एक कम गन्दा, लेकिन अधिक 'हैकी' तरीका केवल मेटा को ओवरराइड करना होगा जब परीक्षण चलाए जा रहे हों। यह एक परीक्षक भी होगा।
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 फ़ाइल में एक टेस्टरनर के रूप में भी परिभाषित करना चाहेंगे।