आप एक असफल रेल प्रवासन को कैसे वापस लाते हैं? मुझे उम्मीद है कि rake db:rollback
असफल प्रवास को पूर्ववत कर देगा, लेकिन नहीं, यह पिछले माइग्रेशन (विफल माइग्रेशन माइनस एक) को वापस ले जाता है। और rake db:migrate:down VERSION=myfailedmigration
या तो काम नहीं करता है। मैं इसमें कुछ बार भाग चुका हूं और यह बहुत निराशाजनक है। इस समस्या का डुप्लिकेट करने के लिए मैंने एक सरल परीक्षण किया है:
class SimpleTest < ActiveRecord::Migration
def self.up
add_column :assets, :test, :integer
# the following syntax error will cause the migration to fail
add_column :asset, :test2, :integer
end
def self.down
remove_column :assets, :test
remove_column :assets, :test2
end
end
परिणाम:
== सरलतम: माइग्रेट करना ============================================================== ======== - add_column (: संपत्ति, परीक्षण: पूर्णांक) -> 0.0932 से - add_column (: संपत्ति, त्रुटि) रेक का गर्भपात! एक त्रुटि हुई है, बाद में सभी माइग्रेशन रद्द कर दिए गए हैं: तर्कों की गलत संख्या (3 के लिए 2)
ठीक है, इसे वापस लाने की अनुमति देता है:
$ रेक डीबी: रोलबैक == AddLevelsToRoles: reverting ================================================== == - remove_column (: भूमिकाएँ, स्तर) -> 0.0778s == AddLevelsToRoles: वापस (0.0779s) ========================================
है ना? SimpleTest से पहले मेरा आखिरी प्रवास था, असफल प्रवास नहीं। (और, यह अच्छा होगा यदि माइग्रेशन आउटपुट में संस्करण संख्या शामिल है।)
तो असफल माइग्रेशन SimpleTest के लिए डाउन रन करने का प्रयास करें:
$ रेक डीबी: माइग्रेट: डाउन संस्करण = 20090326173033 $
कुछ भी नहीं होता है, और कोई आउटपुट भी नहीं। लेकिन शायद यह प्रवास को वैसे भी भागा? तो सिंपलटेस्ट माइग्रेशन में सिंटैक्स त्रुटि को ठीक करने देता है, और इसे फिर से चलाने का प्रयास करता है।
$ रेक डीबी: माइग्रेट: अप वर्सन = 20090326173033 == सरलतम: माइग्रेट करना ============================================================== ======== - add_column (: संपत्ति, परीक्षण: पूर्णांक) रेक का गर्भपात! मैसकल :: त्रुटि: डुप्लीकेट कॉलम नाम 'परीक्षण': अन्य तालिका `संपत्ति` जोड़ें `परीक्षण` इंट (11)
नहीं। स्पष्ट रूप से माइग्रेट: डाउन काम नहीं किया। यह विफल नहीं है, यह सिर्फ क्रियान्वित नहीं है।
मैन्युअल रूप से डेटाबेस में जाने और इसे हटाने के अलावा, और फिर परीक्षण चलाने के अलावा उस डुप्लिकेट तालिका से छुटकारा पाने का कोई तरीका नहीं है। वहाँ से एक बेहतर तरीका हो गया है।