Django दक्षिण के साथ पीछे की ओर प्रवास


217

ठीक है, तो यह पूछने के लिए वास्तव में मूर्खतापूर्ण बात की तरह लगता है, और मुझे यकीन है कि मैं कहीं न कहीं याद कर रहा हूं।

आप Django पर दक्षिण का उपयोग करके बैकवर्ड माइग्रेशन कैसे करते हैं?

इसलिए मैंने अपने मॉडल को ट्विस्ट किया schemamigration, साथ एक माइग्रेशन बनाया, माइग्रेशन को चलाएं migrate, और अब मुझे एहसास हुआ कि जो मैं चाहता था वह बिलकुल नहीं है और मैं इसे पहले भी वापस चाहता हूं।

मैन्युअल रूप से डीबी टेबल को संपादित करने और माइग्रेशन फ़ाइलों को हटाने के लिए लघु, मुझे माइग्रेशन को वापस लाने के बारे में कैसे जाना चाहिए? मुझे Google के माध्यम से दक्षिण का उपयोग करते हुए पिछड़े पलायन का संदर्भ मिलता है, लेकिन अभी तक इसके लिए एक ठोस कोड उदाहरण नहीं मिला है।

क्या कोई मदद कर सकता है?


अच्छा प्रश्न!!
मार्शल एक्स

जवाबों:


335

आप स्थानांतरण की संख्या पता लगाने की जरूरत है बस से पहले एक रोल वापस करने के लिए आप चाहते हैं।

आपके ऐप में एक माइग्रेशन डायरेक्टरी होनी चाहिए, जिसमें फ़ाइलें हैं जैसे नाम

0000_initial.py
0001_added_some_fields.py
0002_added_some_more_fields.py
0003_deleted_some_stuff.py

आम तौर पर, जब आप दौड़ते हैं ./manage.py migrate your_app, तो दक्षिण सभी नए माइग्रेशन चलाता है, क्रम में। (यह तय करने के लिए डेटाबेस तालिकाओं को देखता है कि कौन से 'नए' हैं)।

हालाँकि, आप किसी भी माइग्रेशन को संख्या के अनुसार निर्दिष्ट कर सकते हैं, और साउथ आपके डेटाबेस को, या तो फॉरवर्ड या बैकवर्ड , उस बिंदु पर ले जाएगा। इसलिए, ऊपर दी गई उदाहरण फ़ाइलों के साथ, यदि आप पहले से ही 0003 तक माइग्रेट कर चुके हैं, और आप 0003 को रिवर्स में चलाना चाहते हैं (इसे प्रभावी ढंग से हटाते हुए), तो आप दौड़ेंगे

./manage.py migrate your_app 0002

दक्षिण डेटाबेस को देखेगा, महसूस करेगा कि यह पहले से ही 0003 चला चुका है, और यह निर्धारित करता है कि 0002 को वापस लाने के लिए इसे 0003 के लिए रिवर्स माइग्रेशन चलाना होगा।


1
दुर्भाग्यवश, जब आप अपना अगला माइग्रेशन बनाते हैं, तो यह लोगों को बीच में नहीं छोड़ता है, इसलिए आप बस बाद में उनके माध्यम से माइग्रेट करते हैं। लगता है कि एक बेहतर तरीका हो सकता है।
मिसेलनर

44
@mlissner यदि आप वास्तव में चाहते हैं, तो डेटाबेस को वापस करने के बाद, दिए गए ऐप के माइग्रेशन फ़ोल्डर में जाएं (उपरोक्त उदाहरण में your_app / माइग्रेशन) और अवांछित माइग्रेशन को हटाएं
जोश रूसो

1
बिल्कुल - दक्षिण कभी भी पलायन को रोक नहीं सकता है; यह उम्मीद करता है कि 0001-nnn से फाइलें nnnn के किसी भी मूल्य के लिए माइग्रेशन के लगातार सेट का प्रतिनिधित्व करती हैं। अगर ऐसा नहीं है, तो आपको अपने आप को अपमानित करने या फिर से हटाने की आवश्यकता है।
इयान क्लीलैंड

217

बस किसी के मामले में (मेरे जैसा) सोच रहा था कि प्रारंभिक (0001) से वापस कैसे जाया जाए :

django-admin.py migrate some_app zero

उत्पादन:

Running migrations for some_app:
 - Migrating backwards to zero state.
 < some_app:0001_initial

"शून्य" किसी भी प्रवास से पहले एक विशेष स्थिति है।

संदर्भ: http://south.aeracode.org/docs/commands.html


6
किसी ने 0001 --fake पर माइग्रेट किया, और यह 0001 को पीछे की ओर चलाने का एकमात्र तरीका था। धन्यवाद!
jmanning2k

1
बहुत महत्वपूर्ण उत्तर, मुझे आश्चर्य हुआ कि migrate 0000काम क्यों नहीं किया। नकली माइग्रेशन के बारे में, हाँ, आपको इसकी आवश्यकता हो सकती है, यदि आपको उदाहरण के लिए प्रारंभिक माइग्रेशन (केवल गलत) पूर्ववत करने की आवश्यकता है, लेकिन माइग्रेशन इतिहास सोचता है, कि यह माइग्रेशन कभी नहीं हुआ है।
टॉमस गैंडर

3

मापदंडों के अंत में एक माइग्रेशन नाम जोड़ें:

./manage.py migrate app-name 00xx-migration-name

2
यह ठीक है, और मैंने पहले भी ऐसा किया है, लेकिन यह बहुत कुछ टाइपिंग / पेस्टिंग है। इस मामले में नंगे "राज्य" संख्या - 00xxपर्याप्त है। माइग्रेशन में सुधार और परीक्षण करते समय आपके पास इतिहास में दोनों कमांड हो सकते हैं: आगे (कोई तर्क नहीं), पिछले राज्य संख्या के साथ पीछे।
टॉमस गैंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.