किसी विशिष्ट माइग्रेशन को रोलबैक कैसे करें?


806

मेरे पास निम्नलिखित माइग्रेशन फ़ाइल है db\migrate\20100905201547_create_blocks.rb

मैं विशेष रूप से उस माइग्रेशन फ़ाइल को कैसे रोलबैक कर सकता हूं?


1
क्या यह मुद्दे को संबोधित करता है? आपको बस Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich

4
पलायन की हर जानकारी यहाँ
Nishutosh Sharma

1
क्या आप केवल उस एकल विशिष्ट माइग्रेशन को रोल करना चाहते हैं (भले ही इसके बाद आने वाले नए माइग्रेशन हों)? या क्या आप डेटाबेस को उस स्थिति में वापस रोल करना चाहते हैं जो उस माइग्रेशन से पहले था, और किसी भी बाद के माइग्रेशन को लागू किया गया था?
जॉन श्नाइडर

जवाबों:


1339
rake db:rollback STEP=1

ऐसा करने का एक तरीका है, अगर आप जिस माइग्रेशन को रोलबैक करना चाहते हैं वह अंतिम लागू है। आप उन सभी माइग्रेशनों के लिए 1 स्थानापन्न कर सकते हैं जो आप वापस जाना चाहते हैं।

उदाहरण के लिए:

rake db:rollback STEP=5

बाद में हुए सभी माइग्रेशन को रोलबैक भी करेगा (4, 3, 2 और 1 भी)।

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

rake db:migrate VERSION=20100905201547

केवल एक विशिष्ट माइग्रेशन (आदेश के बाहर) को रोलबैक करने के लिए:

rake db:migrate:down VERSION=20100905201547

ध्यान दें कि यह किसी भी अंतरवर्ती पलायन को रोलबैक नहीं करेगा - केवल एक सूचीबद्ध। यदि वह ऐसा नहीं है जिसका आपने इरादा किया था, तो आप सुरक्षित रूप से चला सकते हैं rake db:migrateऔर यह केवल उसी को फिर से चलाएगा, किसी भी अन्य को छोड़ देना जो पहले वापस नहीं लुढ़का था।

और यदि आप कभी भी किसी एकल माइग्रेशन को क्रम से बाहर करना चाहते हैं, तो इसका उलटा भी होता है db:migrate:up:

rake db:migrate:up VERSION=20100905201547

14
"विशिष्ट संस्करण में रोलबैक करने के लिए" - वह कमांड नहीं है जो केवल उस संस्करण पर वापस जाने के बजाय सभी प्रकार के रोलबैक के बजाय एक विशिष्ट माइग्रेशन का अनुसरण करता है?
एंड्रयू ग्रिम

10
"विशिष्ट संस्करण उपयोग के लिए रोलबैक करने के लिए ..." यह उत्तर गलत है! यह अलगाव में प्रवास को रोलबैक करेगा जैसा कि अन्य उत्तरों द्वारा समझाया गया है।
Rhys van der Waerden

3
चेतावनी: मैंने यह गलती की है: केवल रेक डीबी का उपयोग करें: माइग्रेट करें: नीचे संस्करण = 20100905201547 अलगाव में रोलबैक करने के लिए !!! एक माइग्रेशन फ़ाइल। यह ऊपर टिप्पणी में उल्लेख किया गया है, लेकिन मैंने इसे याद किया।
21

3
चेतावनी का एक और शब्द - कभी मत करो STEP=-1। मैंने एक बार ऐसा किया और यह पागल हो गया, सब कुछ वापस कर दिया। अच्छा नहीं है! यह रेल 4.2 थी - मुझे लगता है कि यह अब तक तय हो सकती है।
डेव हार्टनॉल

1
माइग्रेशन के बारे में मेरे ब्लॉग में एक लेख लिखा, जो बताता है कि कैसे और कब इन आदेशों का उपयोग करना है: railsguides.net/pould-rails-migrations
ka8725

867
rake db:migrate:down VERSION=20100905201547

विशिष्ट फ़ाइल को वापस रोल करेगा।


सभी माइग्रेशन का संस्करण खोजने के लिए, आप इस कमांड का उपयोग कर सकते हैं:

rake db:migrate:status

या, माइग्रेशन के फ़ाइल नाम का उपसर्ग केवल वह संस्करण है जिसे आपको रोलबैक करने की आवश्यकता है।


माइग्रेशन पर रूबी ऑन रेल गाइड प्रविष्टि देखें ।


48
निश्चित रूप से मेरी राय में पसंदीदा जवाब।
स्ट्रीटलॉग्स

30
यह ध्यान देने योग्य है कि यदि आप किसी विशिष्ट माइग्रेशन को वापस रोल करते हैं और यह नहीं चाहते कि यह आगामी रेक कार्यों पर फिर से माइग्रेट हो, तो माइग्रेट फ़ाइल को भी हटा दें।
ब्रैडगर्न्स

4
नोट: ऐसा लगता है कि यदि अप माइग्रेशन कभी सफल नहीं हुआ, लेकिन केवल आंशिक रूप से निष्पादित किया गया है, तो डाउन कुछ भी नहीं करता है।
साइरिलचम्पियर

1
@nerith, यह शायद केवल उन डेटाबेस के लिए सही है जो Transactional DDL का समर्थन नहीं करते हैं। MySQL Transactional DDL का समर्थन नहीं करता है: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL करता है: wiki.postgresql.org/wiki/… ताकि यदि MySQL डेटाबेस पर आपका माइग्रेशन टूट गया है तब आपके पास माइग्रेशन के उस भाग को हटाने के लिए मैन्युअल रूप से है जो सफल हुआ।
Иван Бишевац

1
@BradGreens टिप्पणी के बारे में एक और अवलोकन। यदि आप माइग्रेशन फ़ाइल को हटाना चाहते हैं, और यह पहले ही तैनात किया जा चुका है, तो आप कोड को हटाए गए फ़ाइल के साथ कोड करने से पहले उत्पादन / स्टेजिंग रोल करना चाहते हैं। अन्यथा आप रोलबैक / माइग्रेट नहीं कर पाएंगे: नीचे।
एडम टीटी

57

अंतिम माइग्रेशन को रोलबैक करने के लिए आप निम्न कार्य कर सकते हैं:

rake db:rollback

यदि आप किसी विशिष्ट माइग्रेशन को उस संस्करण के साथ रोलबैक करना चाहते हैं जो आपको करना चाहिए:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

उदाहरण के लिए यदि संस्करण 20141201122027 है, तो आप यह करेंगे:

rake db:migrate:down VERSION=20141201122027

उस विशिष्ट माइग्रेशन को रोलबैक करने के लिए।


32

आप rake db:rollbackविभिन्न विकल्पों का उपयोग करके अपने माइग्रेशन को रोलबैक कर सकते हैं। सिंटैक्स आपकी आवश्यकताओं के अनुसार अलग होगा।

यदि आप केवल अंतिम माइग्रेशन को रोलबैक करना चाहते हैं, तो आप या तो उपयोग कर सकते हैं

rake db:rollback

या

rake db:rollback STEP=1

यदि आप एक बार में माइग्रेशन का रोलबैक नंबर चाहते हैं, तो आप बस एक तर्क देते हैं:

rake db:rollback STEP=n

nरोलबैक में माइग्रेशन की संख्या कहां है, नवीनतम माइग्रेशन से गिना जाता है।

यदि आप किसी विशिष्ट माइग्रेशन पर वापस जाना चाहते हैं, तो आपको निम्नलिखित में माइग्रेशन का संस्करण पास करना चाहिए:

rake db:migrate:down VERSION=xxxxx

जहाँ xxxxx प्रवासन का संस्करण संख्या है।


1
जोड़ना: नीचे काम नहीं कर रहा है, लेकिन सही उत्तर नीचे है
Elta3lab

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

संस्करण माइग्रेशन फ़ाइल नाम पर संख्यात्मक उपसर्ग है

संस्करण कैसे खोजें :

आपकी माइग्रेशन फ़ाइलें आपकी rails_root/db/migrateनिर्देशिका में संग्रहीत की जाती हैं । वह उपयुक्त फ़ाइल खोजें, जिसमें आप उपसर्ग संख्या को रोलबैक और कॉपी करना चाहते हैं।

उदाहरण के लिए

फ़ाइल का नाम: 20140208031131_create_roles.rb फिर संस्करण है20140208031131


6
माइग्रेशन आईडी को खोजने का सबसे सरल तरीका हैrake db:migrate:status
Aeradriel

18

पिछला माइग्रेशन रोलिंग:

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

nपलायन की अंतिम संख्या को वापस लाना

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

एक विशिष्ट माइग्रेशन को वापस रोल करना

# rails < 5.0
rake db:migrate:down VERSION=20100905201547

# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547

14

अंतिम माइग्रेशन को रोलबैक करने के लिए आप निम्न कार्य कर सकते हैं:

rake db:rollback

यदि आप किसी विशिष्ट माइग्रेशन को उस संस्करण के साथ रोलबैक करना चाहते हैं जो आपको करना चाहिए:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

यदि आप जिस माइग्रेशन फ़ाइल को रोलबैक करना चाहते हैं db/migrate/20141201122027_create_some_table.rb, उसे कॉल किया गया था , तो उस माइग्रेशन के लिए संस्करण है 20141201122027, जो उस माइग्रेशन को बनाते समय टाइमस्टैम्प है, और उस माइग्रेशन को वापस रोल करने का कमांड होगा:

rake db:migrate:down VERSION=20141201122027

6

यदि यह प्रतिवर्ती माइग्रेशन है और अंतिम एक जिसे निष्पादित किया गया है, तो चलाएं rake db:rollback। और आप हमेशा संस्करण का उपयोग कर सकते हैं। जैसे

माइग्रेशन फ़ाइल 20140716084539_create_customer_stats.rb है, इसलिए रोलबैक कमांड होगी, rake db:migrate:down VERSION=20140716084539


6

किसी विशेष संस्करण (जैसे 20181002222222) तक सभी माइग्रेशन को वापस रोल करने के लिए , उपयोग करें:

rake db:migrate VERSION=20181002222222

(ध्यान दें कि यह उपयोग करता है db:migrate- db:migrate:downइस प्रश्न के अन्य उत्तरों की तरह नहीं ।)

निर्दिष्ट माइग्रेशन संस्करण को वर्तमान संस्करण से पुराना मानते हुए, यह सभी माइग्रेशन को वापस रोल अप करेगा, लेकिन निर्दिष्ट संस्करण शामिल नहीं है।

उदाहरण के लिए, यदि rake db:migrate:statusप्रारंभ में प्रदर्शित होता है:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  up      20181003171932  Some migration description
  up      20181004211151  Some migration description
  up      20181005151403  Some migration description

चल रहा है:

rake db:migrate VERSION=20181002222222

में परिणाम होगा:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  down    20181003171932  Some migration description
  down    20181004211151  Some migration description
  down    20181005151403  Some migration description

संदर्भ: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations


4

से रेल गाइड

पिछला माइग्रेशन बदलना

आप revertविधि का उपयोग करके माइग्रेशन रोलबैक करने के लिए सक्रिय रिकॉर्ड की क्षमता का उपयोग कर सकते हैं :

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

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

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute <<-SQL
                ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                    CHECK (char_length(zipcode) = 5);
              SQL
            end
            dir.down do
              execute <<-SQL
                ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
              SQL
            end
          end

          # The rest of the migration was ok
        end
      end
    end

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


3

माइग्रेशन कमांड का उपयोग करके डेटाबेस की स्थिति को बदलते हैं

$ bundle exec rake db:migrate

हम एक एकल माइग्रेशन चरण का उपयोग पूर्ववत कर सकते हैं

  $ bundle exec rake db:rollback

शुरुआत में वापस जाने के लिए, हम उपयोग कर सकते हैं

  $ bundle exec rake db:migrate VERSION=0

जैसा कि आप अनुमान लगा सकते हैं, 0 संस्करण के लिए किसी अन्य संख्या को प्रतिस्थापित करने से उस संस्करण संख्या में माइग्रेट होता है, जहाँ संस्करण संख्या क्रमिक रूप से माइग्रेशन सूचीबद्ध करने से आती है


2

अच्छी तरह से रेल 5 में यह काफी आसान रेक डीबी है: माइग्रेट: स्टेटस या रेल्स डीबी: माइग्रेट: स्टेटस

इसे एक ही तरीके से संभालने के लिए संशोधित किया गया था, फिर बस वह संस्करण चुनें जिसे आप वापस रोल करना चाहते हैं और फिर रेक db चलाएं: VERSION = 2013424230423 माइग्रेट करें

सुनिश्चित करें कि संस्करण सभी बड़े अक्षर हैं

यदि आपको माइग्रेशन के किसी भी चरण के साथ कोई समस्या है या बीच में अटक गया है तो बस माइग्रेशन फ़ाइल पर जाएं और उन लाइनों पर टिप्पणी करें जो पहले से ही माइग्रेट थीं।

उम्मीद है की वो मदद करदे


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

1

यदि आप रोलबैक और माइग्रेट करना चाहते हैं, तो आप चला सकते हैं:

rake db:migrate:redo

यह वही है:

rake db:rollback
rake db:migrate
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.