2010-08-23 12 views
8

मैं डेटाबेस के साथ एक Django प्रोजेक्ट बनाए रखता हूं जिसमें कई डेटाबेस बाधाएं हैं जो वास्तविक डेटाबेस के साथ सिंक हो गई हैं। इसलिए, उदाहरण के लिए, कुछ मॉडल फ़ील्ड में शून्य = गलत सेट है, लेकिन डेटाबेस संबंधित डेटाबेस कॉलम के लिए NULL को अनुमति देता है।डीजेगो - मॉडल कोड से डाटाबेस

मैं जिज्ञासा हूं, या तो Django या किसी तृतीय-पक्ष पायथन स्क्रिप्ट में उपयोगिता है, जो प्रत्येक तालिका के लिए SHOW CREATE तालिका आउटपुट (इस मामले में, MySQL वाक्यविन्यास का उपयोग करके) की तुलना करेगा और इसकी तुलना करें विसंगतियों को हाइलाइट करने के लिए python manage.py sql आउटपुट।

माना जाता है कि, एक आदर्श स्थिति में, डेटाबेस पहले स्थान पर Django मॉडल कोड के साथ सिंक्रनाइज़ नहीं होगा, लेकिन जब से मैं हूं, तो मैं उत्सुक हूं कि इस समस्या का हल होने से पहले मैं उत्सुक हूं खुद को लिखें या मैन्युअल रूप से तुलना करें।

+0

आप इन्हें एक diff टूल से तुलना क्यों नहीं करते हैं, जैसे कि http://www.quickdiff.com/index.php? –

+0

@ गाबी- यही वह है जो मैं हाथ से कर रहा हूं। मैं उत्सुक था अगर किसी ने ऐसी उपयोगिता बनाई जो प्रत्येक के लिए आउटपुट उत्पन्न करता है जिसे मैं आसानी से अलग कर सकता हूं। चूंकि यह अभी है, यह ठीक काम करता है, लेकिन प्रत्येक के लिए आउटपुट लाइन नहीं है, इसलिए मुझे टेबल द्वारा टेबल करना है। –

उत्तर

4

./manage.py inspectdb डेटाबेस के भीतर मौजूद मॉडल के अनुरूप मॉडल फ़ाइल उत्पन्न करता है।

अंतर खोजने और अपनी माइग्रेशन रणनीति की योजना बनाने के लिए आप मानक यूनिक्स diff या किसी अन्य फैंसी diffing tool का उपयोग करके अपनी वर्तमान मॉडल फ़ाइलों के साथ इसे अलग कर सकते हैं।

जबकि पूर्व सरल और बेहतर लगता है, तो आप एसक्यूएल स्तर पर अंतर भी देख सकते हैं। ./manage.py sqlall वर्तमान डीबी स्कीमा के लिए एसक्यूएल उत्पन्न करता है और संगत रूप से show create table table-name तालिका निर्माण के लिए एसक्यूएल दिखाता है।

आप http://code.google.com/p/django-evolution/ को संदर्भित करना चाहते हैं जो एक बार ऑटो ने मौजूदा मॉडलों में डीबी की स्थिति को माइग्रेट कर दिया था। - ध्यान दें, हालांकि, यह परियोजना पुरानी है और छोड़ दी जाती है।

+0

धन्यवाद, लक्ष्मण। Diff उपयोगिता बहुत अच्छी तरह से काम करता है; वास्तव में, मैं यही उपयोग कर रहा हूँ। मैं एक उपयोगिता की तलाश में था जो सेटिंग्स में सभी मॉडलों के माध्यम से चलाएगा .INSTALLED_APPS और प्रत्येक के लिए एसक्यूएल दिखाएं, और फिर डीबी में टेबल एसक्यूएल बनाएं, दो संरचनाएं जो समान रूप से भिन्न हो सकती हैं, जो संरचना में समान हैं। मुझे पता है कि स्वचालित करने के लिए पूरी तरह से संभव नहीं हो सकता है, लेकिन अगर कोई समस्या हल कर लेता तो मैं उत्सुक था। –

+0

जिम, यही कारण है कि मैंने आपको django-evolution देखने के लिए उल्लेख किया। –

+0

लक्ष्मण, मैंने django-evolution पर एक नज़र डाली थी। डेटाबेस रखरखाव के लिए बहुत उपयोगी लगता है; साझा करने के लिए धन्यवाद। –

3

मैं जो कुछ वर्णित करता हूं, उसके त्वरित और गंदे साधनों के साथ आया था। यह सही नहीं है, लेकिन यदि आप ./manage.py testserver चलाते हैं, तो परीक्षण डेटाबेस मॉडल कोड के आधार पर बनाया जाएगा। तब (का उपयोग कर MySQL विशेष सिंटेक्स), आप फ़ाइलों को नियमित रूप से डेटाबेस और परीक्षण डेटाबेस के लिए स्कीमा डंप कर सकते हैं:

$ mysqldump -uroot -p [database_name] --no-data=true > schema.txt 
$ mysqldump -uroot -p [test_database_name] --no-data=true > test_schema.txt 

तो फिर तुम बस diff schema.txt और test_schema.txt और मतभेदों को मिल सकता है।

+0

त्वरित और गंदा, और निम्न स्तर! मुझे यह तथ्य पसंद है कि diff डीबी स्कीमा, सादा और सरल पर है। धन्यवाद। – Fafaman

2

पोस्टग्रेएसक्यूएल के लिए, एक अस्थायी खाली डेटाबेस पर manage.py syncdb करें, फिर उत्पादन और अस्थायी डेटाबेस pg_dump -sOx के साथ डंप करें और परिणामी फ़ाइलों की तुलना करें। दृश्य diff उपकरण के बीच, कम से कम GNOME Meld PostgreSQL डंप के साथ अच्छी तरह से सामना करना प्रतीत होता है।

संबंधित मुद्दे