2012-01-10 53 views
31

मुझे ऐसा कोई विकल्प या कुछ भी नहीं मिल रहा है जो मुझे माइग्रेशन छोड़ने की अनुमति देता है।आप असफल माइग्रेशन कैसे छोड़ते हैं? (रेक डीबी: माइग्रेट)

मैं जानता हूँ कि तुम क्या सोच रहे हैं: "आप ऐसा करने के लिए कभी नहीं होना चाहिए ..."

मैं उस माइग्रेशन को विशिष्ट उपयोगकर्ता रिकॉर्ड में परिवर्तन है कि मेरे विकास डेटाबेस में मौजूद नहीं है बनाता छोड़ करने की जरूरत है । मैं माइग्रेशन को बदलना नहीं चाहता क्योंकि यह उस स्रोत का हिस्सा नहीं है जिसके साथ मुझे काम करना है। माइग्रेशन छोड़ने या विफल माइग्रेशन छोड़ने का कोई तरीका है?

अग्रिम धन्यवाद!

उत्तर

53

मुझे लगता है कि आपको अपमानजनक माइग्रेशन को कम नाजुक होने के लिए ठीक करना चाहिए, मुझे लगता है कि if कथन और शायद rescue पर्याप्त होगा।

लेकिन, अगर माइग्रेशन को ठीक करना वास्तव में एक विकल्प नहीं है, तो आप इसे विभिन्न तरीकों से नकली बना सकते हैं। सबसे पहले, आप माइग्रेशन विधियों पर टिप्पणी कर सकते हैं, rake db:migrate चला सकते हैं, और फिर अपमानजनक माइग्रेशन को असम्बद्ध (या वापस) कर सकते हैं।

तुम भी नकली यह डेटाबेस लेकिन वाक्छल की इस तरह के अंदर कर सकते हैं अनुशंसित नहीं है जब तक आप जानते हैं कि आप क्या कर रहे हैं और आप मैन्युअल रूप से कोई आपत्ति नहीं है चीजों को पैच जब आप (अनिवार्य रूप से) एक गलती करते हैं। schema_migrations नामक आपके डेटाबेस में एक टेबल है जिसमें कॉलम है जिसे version कहा जाता है; कौन सा माइग्रेशन लागू किया गया है इसका ट्रैक रखने के लिए इस तालिका का उपयोग db:migrate द्वारा किया जाता है। आपको बस इतना करना है कि उचित version मान और rake db:migrate INSERT को लगता है कि माइग्रेशन किया गया है। हमलावर प्रवास फ़ाइल खोजें:

db/migrate/99999999999999_XXXX.rb 

फिर अपने डेटाबेस में जाते हैं और कहते हैं:

insert into schema_migrations (version) values ('99999999999999'); 

जहां 99999999999999 ज़ाहिर है, है, प्रवास का फ़ाइल नाम से नंबर। फिर rake db:migrate चलाना उस माइग्रेशन को छोड़ देना चाहिए।

मैं तीसरे से पहले दूसरे विकल्प के साथ जाऊंगा, मैं केवल पूर्णता के लिए "हैक schema_versions" विकल्प शामिल हूं।

+0

हां, मैं सिर्फ आगे चला गया और अस्थायी रूप से अपमानजनक माइग्रेशन को काट दिया। मैं व्यक्तिगत रूप से उचित बना देता था अगर बयानों या सिर्फ उत्पादन वातावरण की जांच की गई थी, लेकिन स्पष्ट रूप से जो व्यक्ति माइग्रेशन को संभालता है वह डीबी का उपयोग करने में विश्वास नहीं करता है: विकास के दौरान माइग्रेट = पी धन्यवाद – hmind

+0

@ हिमंद: "वह व्यक्ति जो संभालता है माइग्रेशन डीबी का उपयोग करने में विश्वास नहीं करते हैं: विकास करते समय माइग्रेट करें "। अरे मेरा। अपने उत्पादन प्रणालियों को प्रकाशित करना एक बहुत ही मजेदार मजेदार समय होना चाहिए! –

+2

सौभाग्य से, मैं या तो हाहा – hmind

1

के बजाय प्रवास आप अपना माइग्रेशन स्मार्ट बना सकता छोड़, तो आप जाँच कर सकते हैं "विशिष्ट उपयोगकर्ताओं"

+0

हाँ को संभाल नहीं पाता हूं, अगर मैंने माइग्रेशन लिखा था तो मैंने यही किया होगा। लेकिन मैंने नहीं किया और मैं वास्तव में स्रोत के हिस्से के साथ घूमना नहीं चाहता हूं कि मुझे वास्तव में स्पर्श नहीं करना चाहिए, इसलिए मैंने उन्हें अस्थायी रूप से काट दिया। – hmind

14

यह एक बंद त्रुटियों के लिए यह करने के लिए एक अच्छा तरीका है, यह करने के लिए कुछ यदि जोड़ने।

db:migrate:up VERSION=my_version

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

मैं यह भी मानता है कि आप माइग्रेशन इस तरह से फिर से करना कर सकते हैं:

rake db:migrate:redo VERSION=my_version

मैं व्यक्तिगत रूप से उस विधि प्रयास नहीं किया है, तो YMMV।

1

कभी कभी, यह निश्चित रूप से सही माइग्रेशन ... साथ schema_migrations तालिका फिर से भरने के लिए आवश्यक है केवल इसी उद्देश्य से के लिए मैं इस विधि

def self.insert_missing_migrations(stop_migration=nil) 
    files = Dir.glob("db/migrate/*") 
    timestamps = files.collect{|f| f.split("/").last.split("_").first} 
    only_n_first_migrations = timestamps.split(stop_migration).first 

    only_n_first_migrations.each do |version| 
    sql = "insert into `schema_migrations` (`version`) values (#{version})" 
    ActiveRecord::Base.connection.execute(sql) rescue nil 
    end 
end 

आप कर सकते हैं इसे में कॉपी-पेस्ट बनाया है किसी भी मॉडल आप चाहते हैं और कंसोल से इसका इस्तेमाल

YourModel.insert_missing_migrations("xxxxxxxxxxxxxx") 

(या किसी भी तरह किसी और)

जहां "xxxxxxxxxxxxxx" - प्रवास के टाइमस्टैम्प जो इससे पहले कि आप प्रविष्टि बंद करना चाहते है (यदि आप इसे खाली छोड़ सकते हैं)

!!! इसका उपयोग केवल तभी करें जब आप पूरी तरह से समझें कि आपको क्या परिणाम मिलेगा !!!

10

मैं एक मुद्दा है, जहां मैं एक मेज पहले से मौजूद हैं, इसलिए मेरे मामले में मैं इस प्रवास को छोड़ने के लिए भी था जोड़ने के लिए एक प्रवास था, क्योंकि मैं त्रुटि

SQLite3::SQLException: table "posts" already exists: CREATE TABLE "posts" 

मैं बस हो रही थी निर्माण तालिका विधि की सामग्री पर टिप्पणी की, माइग्रेशन चलाया, और फिर इसे बाहर निकाला। यह चारों ओर पाने के लिए एक मैनुअल तरीका है, लेकिन यह काम किया। नीचे देखें:

class CreatePosts < ActiveRecord::Migration 
    def change 
    # create_table :posts do |t| 
    # t.string :title 
    # t.text :message 
    # t.string :attachment 
    # t.integer :user_id 
    # t.boolean :comment 
    # t.integer :phase_id 

    # t.timestamps 
    # end 
    end 
end 
+0

यह बहुत अच्छा है !!! विश्वास नहीं कर सकता मैंने इस बारे में नहीं सोचा था। पूरी तरह से काम किया। – helpse

7

यदि आपको ऐसा करना है, तो आपके ऐप के माइग्रेशन गड़बड़ हो गए हैं!

आवेषण सब याद आ रही माइग्रेशन:

def insert(xxx) 
    ActiveRecord::Base.connection.execute("insert into schema_migrations (version) values (#{xxx})") rescue nil 
end 

files = Dir.glob("db/migrate/*") 
files.collect { |f| f.split("/").last.split("_").first }.map { |n| insert(n) } 
+1

जरूरी नहीं है। उदाहरण के लिए यदि आप उत्पादन डेटा के साथ किसी समस्या का निवारण करने के लिए अपने उत्पादन डेटाबेस में अपने उत्पादन डेटाबेस को pg_restore करते हैं। जब आप सभी जानकारी नहीं है तो किसी को यह बताने में इतनी जल्दी मत बनो कि वे गलत कर रहे हैं। –

+0

@ माइकबेथनी: मेरे मामले में जब मुझे इसका इस्तेमाल करना पड़ा, तो सब कुछ एक बड़ी गड़बड़ी थी और मेरे पास यह समझने का समय नहीं था कि ऐसा क्यों हुआ। Pg_restore के बारे में, मुझे सही लगता है कि 'schema_migrations' तालिका को भी पुनर्स्थापित करना चाहिए? – Dorian

+0

हाँ, ज़ाहिर है, 'schema_migrations' तालिका डेटाबेस में सिर्फ एक तालिका है। अपना शीर्षक दोबारा पढ़ना मैं एक और व्याख्या देख सकता हूं। मैंने मूल रूप से इसे पढ़ा, "आपने अपने माइग्रेशन को ठीक से नहीं लिखा था।" मुझे लगता है कि आप वास्तव में मतलब है, "माइग्रेशन के साथ एक समस्या है।" लेकिन यह स्पष्ट है, इसलिए सवाल, इसलिए मैंने "आप खराब" अर्थ माना। मेरी गलती। –

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