PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

कई पोस्टग्रेज स्कीमा के लिए Django इकाई परीक्षण विफल

कई अन्य डीबी इंजनों में स्कीमा का उपयोग नहीं किया जाता है। अपने मॉडलों में एक स्कीमा निर्दिष्ट करके, आपने पोस्टग्रेज के लिए अपने कोड में एक निर्भरता का परिचय दिया है।

आप अपनी समस्या का समाधान करने के लिए दो मार्ग अपना सकते हैं;

सबसे पहले, आप अपने पोस्टग्रेज उपयोगकर्ता के लिए एक डिफ़ॉल्ट खोज पथ जोड़ सकते हैं। इस दृष्टिकोण का नुकसान यह है कि स्कीमा का उपयोग अब नेमस्पेसिंग के लिए नहीं किया जा सकता है, लेकिन लाभ यह है कि यदि आपका डेटाबेस कभी भी किसी भिन्न इंजन में बदलता है, तो आपका कोड ठीक काम करेगा। अपनी तालिकाओं के नामकरण के कुछ मानक तरीके को चुनकर अपनी तालिकाओं को नेमस्पेसिंग प्राप्त किया जा सकता है, ठीक उसी तरह जैसे कि 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 फ़ाइल में एक टेस्टरनर के रूप में भी परिभाषित करना चाहेंगे।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSONB ऑब्जेक्ट से वास्तविक मानों के साथ प्रमुख नाम निकालना

  2. पोस्टग्रेज - इंसर्ट पर ST_SetSRID(ST_MakePoint(lng, lat), 4326) को स्वचालित रूप से कैसे कॉल करें?

  3. स्कीमा पर दृश्य बनाने की अनुमति नहीं दे सकता

  4. पोस्टग्रेएसक्यूएल अप्सर्ट (संघर्ष पर) इन्सर्ट और अपडेट में समान मूल्यों के साथ

  5. मुझे यह त्रुटि SQL लाइट से Posgres DB में माइग्रेशन डेटा क्यों प्राप्त होती है? डुप्लिकेट कुंजी मान अद्वितीय बाधा का उल्लंघन करता है