2009-06-17 29 views
20

क्या रेक डीबी है: माइग्रेट केवल नए माइग्रेशन जोड़ें, या क्या यह सभी माइग्रेशन/परिवर्तनों को छोड़ देता है और सब कुछ नया बनाता है?वास्तव में रेक डीबी क्या करता है: माइग्रेट करें?

मुझे लगता है कि रेक एक त्रुटि फेंक रहा है क्योंकि यह प्रवासन 040 में एक तालिका विशेषता को एक्सेस करने का प्रयास कर रहा है जो माइग्रेशन 042 में हटा दिया गया था। किसी भी तरह मेरा डीबी और रेक सिंक से बाहर हैं और मैं उन्हें ठीक करना चाहता हूं।

आपके विशेषज्ञों के लिए - क्या माइग्रेशन के साथ सिंक से बाहर निकलने के लिए रेक के लिए आम बात है? मैं इससे कैसे बच सकता हूं (नहीं, मैं अपनी स्कीमा या रेक फाइलों को संपादित नहीं करता हूं)।

उत्तर

14

प्रत्येक बार जब आप स्क्रिप्ट का उपयोग करते हुए माइग्रेशन बनाते हैं (जैसे स्क्रिप्ट/जेनरेट मॉडल ...) एक वास्तविक माइग्रेशन वास्तविक डेटाबेस के साथ सिंक किए जाने के लिए तैयार सही निर्देशिका में जोड़ा जाता है।

वास्तव में रेक डीबी: माइग्रेट बस जांचें कि गायब माइग्रेशन को अभी भी previouse वाले लोगों की देखभाल किए बिना डेटाबेस पर लागू करने की आवश्यकता है।

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

21

जब आप रेल माइग्रेशन का उपयोग करते हैं, तो schema_migrations नामक एक तालिका स्वचालित रूप से बनाई जाती है, जो प्रत्येक माइग्रेशन के संस्करण संख्या को संग्रहीत करके माइग्रेशन लागू किया गया है, यह ट्रैक रखता है (यह वह संख्या है जो फ़ाइल नाम में माइग्रेशन नाम को प्रीफ़ेस करती है , यानी डीबी/माइग्रेट/_20090617111204__ माइग्रेशन.आरबी)। जब आप माइग्रेट करने के लिए rake db:migrate चलाते हैं, केवल माइग्रेशन जो पहले नहीं चलाए गए थे (यानी उनका संस्करण तालिका में निहित नहीं है) इस कारण से, माइग्रेशन को पहले से निष्पादित कर दिया गया है, db:migrate चलाते समय कोई प्रभाव नहीं पड़ेगा)। माइग्रेट करते समय, schema_migrations में पाए गए सभी संस्करण जो आपके द्वारा वापस रोल किए जा रहे संस्करण से अधिक हैं, पूर्ववत हो जाएंगे।

+2

धन्यवाद इस उत्तर ने मेरे लिए और अधिक विशिष्टताओं को प्रस्तुत किया। डीबी में कहीं भी schema_migrations क्यों नहीं है: प्रलेखन माइग्रेट करें? यह प्रणाली के बारे में मेरी समझ में लापता टुकड़ा था कि कैसे "माइग्रेशन को चलाने के लिए काम करना चाहिए" के साथ रेल कैसे होता है! –

5

एक प्रवासन का अर्थ है कि आप वर्तमान संस्करण से नए संस्करण में स्थानांतरित होते हैं (जैसा कि पहले उत्तर में कहा गया है)। रेक डीबी का उपयोग करना: माइग्रेट करें आप अपनी स्कीमा में कोई भी नया बदलाव लागू कर सकते हैं। लेकिन यदि आप पिछले माइग्रेशन में रोलबैक करना चाहते हैं तो आप रेक डीबी का उपयोग कर सकते हैं: यदि आपके गलत परिवर्तनों को गलत तरीके से परिभाषित किया गया है तो अपने नए बदलावों को रद्द करने के लिए रोलबैक। सावधानी: ऐसा करके आपका डेटा खो जाएगा।

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