यह केवल एक सिद्धांत है जिसे मैं दूसरों की प्रतिक्रिया और शायद इसी तरह के अनुभवों के आधार पर समझना चाहता हूं।Django SQLite परीक्षण विषमता: निष्पादन के विभिन्न पथ?
परीक्षण चलाने के लिए mySQL का उपयोग कर रहे थे, लेकिन निश्चित रूप से एक इन-मेमोरी SQLite डेटाबेस बहुत तेज है। हालांकि, ऐसा लगता है कि कुछ समस्याएं चल रही हैं।
DATABASE_ENGINE
django.db.backends.sqlite3
उपयोग करने के लिए सेट कर दिया जाता है और मैं manage.py test
चलाते हैं, उत्पादन आशा की जाती है के रूप में नहीं:
(सबसे लाइनों निकाला गया, लेकिन असफलता का दिलचस्प अंक उनका कहना है)
$ python manage.py test Traceback (most recent call last): File "manage.py", line 12, in execute_manager(settings) File "/Users/bartekc/.virtualenvs/xx/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager utility.execute() File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 51, in class AcvTripIncentive(models.Model): # First interesting failure File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 55, in AcvTripIncentive trip = models.OneToOneField(Trip, limit_choices_to={'sites' : Site.objects.get(name='ZZ'), 'is_active' : True,}) # Next interesting failure File "/Users/bartekc/domains/xx/xx/associates/yyz/models.py", line 252, in current_site = Site.objects.get_current()
एक से अधिक कर रहे हैं इस तरह की असफलताओं, लेकिन बस एक जोड़े को इंगित करते हैं। समस्या स्पष्ट है। साइट मॉडल में कोई वास्तविक डेटा नहीं है, लेकिन फ़ाइलों में कोड होता है जो साइट मॉडल के तहत वर्तमान, या विशिष्ट उदाहरण लाने की कोशिश करता है।
अब, मैं एक आसान समाधान के बारे में सोच सकता हूं: OneToOneField
को limit_choices_to
के साथ फ़ंक्शन का उपयोग करने के लिए स्विच किया जाना चाहिए, और दूसरा एक जैसा है। जब आवश्यक हो तो फ़ंक्शन को Django द्वारा फ़ाइल की आरंभिक स्कैनिंग पर नहीं कहा जाता है।
हालांकि, मेरा वास्तविक प्रश्न यह है: यह SQLite के साथ क्यों होता है और MySQL नहीं?। क्या दो डेटाबेस इंजन परीक्षण के माध्यम से प्रक्रिया का एक अलग तरीका है? मैं ऐसा नहीं सोचूंगा, क्योंकि पाइथन मॉडलों की सभी संकलन कर रहा है।
वास्तव में क्या हो रहा है?
चीयर्स।
क्या आपने सोचा था कि जब भी आप परीक्षण चलाते हैं, तब SQLite डेटाबेस नए और खाली बनाए जाते हैं, जबकि mysql डेटाबेस समान हो सकता है जो आप उत्पादन/विकास के लिए उपयोग करते हैं और इसमें पहले से ही कुछ और डेटा है? –
MySQL डेटाबेस भी हर बार एक नया बनाया गया है। – Bartek
आप अपने मॉडल में Site.objects.get_current() कहां कॉल करते हैं? क्या यह सहेजने() विधि में या सिग्नल में है? –