एकल माइग्रेशन फ़ाइल चलाएँ


267

क्या एकल प्रवास चलाने का एक आसान तरीका है? मैं एक निश्चित संस्करण में स्थानांतरित नहीं करना चाहता, जिसे मैं केवल एक विशिष्ट चलाना चाहता हूं।


क्या यह कुछ ऐसा है जिसे आप एक बार माइग्रेशन के रूप में चलाते हैं क्योंकि यह आवश्यक हो गया है, फिर एक उपयोगी क्वेरी बन जाती है जिसे कई बार चलाने की आवश्यकता हो सकती है? शायद आपको किसी मॉडल या अन्य ऑब्जेक्ट में माइग्रेशन की सामग्री को रिफ्लेक्टर करना चाहिए, फिर माइग्रेशन संदर्भ को नए स्थान पर रखें। तब आप कमांड लाइन पर माणिक्य लगाकर अपने घाव पर नई वस्तु को लगा सकते हैं।
नाथन फेगर

जवाबों:


239

आप बस रूबी फ़ाइल से सीधे कोड चला सकते हैं:

rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up

नोट: रेल के नए संस्करणों के AddFoos.new.upबजाय की आवश्यकता हो सकती है AddFoos.up

एक वैकल्पिक तरीका (आईआरबी के बिना) जो इस तथ्य पर निर्भर करता है कि वर्ग नामों की एक सरणी की आवश्यकता होती है:

script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'

ध्यान दें कि यदि आप ऐसा करते हैं, तो यह संभवतः schema_migrationsतालिका को अपडेट नहीं करेगा , लेकिन ऐसा लगता है कि आप वैसे भी चाहते हैं।


58
कभी-कभी आपको आवश्यकता पथ के सामने एक './' की आवश्यकता होती है, और यह निश्चित रूप से स्कीमा_मिग्रेशन को अपडेट नहीं करता है।
बेयर्डो

14
मुझे कॉल करने से पहले माइग्रेशन ऑब्जेक्ट का एक उदाहरण बनाना था। जैसेAddFoos.new.up
बेंटलेओ

15
तो, रेल 3.2 के लिए योग करने के लिए: require "./db/migrate/db/migrate/20090408054532_add_foos.rb"फिरAddFoos.new.up
trisweb

50
अपने माइग्रेशन का उपयोग करता है changeके बजाय upऔर down, आप चलाने की आवश्यकता होगीAddFoos.new.migrate(:up)
डॉन Werve

6
रेल 4 में, आप कॉल कर सकते हैंAddFoos.new.change
lfender6445

429

रेल के हालिया संस्करण को मानकर आप हमेशा दौड़ सकते हैं:

rake db:migrate:up VERSION=20090408054532

जहाँ संस्करण माइग्रेशन के फ़ाइलनाम में टाइमस्टैम्प है।

संपादित करें: पिछले 8 वर्षों में कुछ बिंदु पर (मुझे यकीन नहीं है कि कौन सा संस्करण है) रेल्स ने चेक जोड़े हैं जो इसे चलाने से रोकते हैं यदि यह पहले से ही चलाया जा चुका है। यह schema_migrationsतालिका में एक प्रविष्टि द्वारा इंगित किया गया है। इसे फिर से चलाने के लिए, rake db:migrate:redo VERSION=20090408054532इसके बजाय बस निष्पादित करें ।


124
वास्तव में कमांड रेक db है: माइग्रेट: redo VERSION = my_version
चिराग पटेल

2
@ चिराग पटेल: यही तो मैं चाह रहा था! धन्यवाद!
हाबिल

23
Redo दिए गए माइग्रेशन के डाउन-मेथड और उसके बाद अप मेथड को चलाता है। अप केवल अप-विधि चलाता है, और मुझे लगता है कि वास्तव में पूछने वाला व्यक्ति यही चाहता है।
स्वेन कोसनिके

7
उदाहरण के लिए, डेटाबेस स्कीमा संस्करण बाद में प्रश्न में माइग्रेशन की तुलना में 'अप' नहीं चलता है, जो उदाहरण के लिए, किसी अन्य व्यक्ति के परिवर्तन को मर्ज करने पर हो सकता है।
मैट कोनोली

3
धन्यवाद, मैंने इसके लिए नीचे का उपयोग कियाrake db:migrate:down VERSION=XXX
नाइट्रोडिस्ट

107

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

$ rake db:migrate:up VERSION=20080906120000

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

# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3

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

# this is super useful
$ rake db:migrate:redo VERSION=20080906120000

(आप अपने प्रवास के फ़ाइल नाम में संस्करण संख्या पा सकते हैं)


संपादित करें: आप बस अपनी माइग्रेशन फ़ाइल का नाम बदल सकते हैं, जैसे:

20151013131830_my_migration.rb -> 20151013131831_my_migration.rb

फिर सामान्य रूप से माइग्रेट करें, इससे माइग्रेशन को एक नया माना जाएगा (उपयोगी यदि आप किसी दूरस्थ वातावरण (जैसे स्टेजिंग) पर माइग्रेट करना चाहते हैं, जिस पर आपका नियंत्रण कम है।

संपादन 2 : आप डेटाबेस में केवल माइग्रेशन प्रविष्टि को भी संलग्न कर सकते हैं। उदाहरण के लिए:

rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)

rake db:migrateइसके बाद upरुके हुए पलायन की विधि का पुनर्मिलन होगा।


दोनों "अप" और "रीडो" मेरे लिए काम नहीं करते थे, लेकिन स्कीमा_माइग्रेशन में पंक्ति हटाना एकदम सही था।
cesoid

27

यदि आपने changeइस तरह एक विधि लागू की है :

class AddPartNumberToProducts < ActiveRecord::Migration
  def change
    add_column :products, :part_number, :string
  end
end

आप माइग्रेशन का एक उदाहरण बना सकते हैं और इस तरह से चला सकते हैं migrate(:up)या इंस्टेंस कर सकते हैं migrate(:down):

$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)

1
यदि आप उपयोग कर रहे हैं upऔर यह भी लागू होता है down
gak

17

यह माइग्रेशन फ़ाइल "20150927161307_create_users.rb" को फिर से चलाने के लिए चरण हैं

  1. कंसोल मोड चलाएँ। (रेल्स सी)
  2. उस फ़ाइल में कंसोल में उस क्लास को कॉपी और पेस्ट करें।

    class CreateUsers < ActiveRecord::Migration
      def change
        create_table :users do |t|
          t.string :name
          t.string :email
          t.timestamps null: false   end
        end
      end
    end
  3. कक्षा का एक उदाहरण बनाएँ CreateUsers:c1 = CreateUsers.new

  4. changeउस उदाहरण की विधि निष्पादित करें :c1.change

बस वर्ग के साथ फाइल की आवश्यकता होती है, जैसे कंसोल में: require "./db/migrate/20150927161307_create_users.rb"कॉपी और पेस्ट करने के बजाय। फिर आप कक्षा में परिभाषित विधि को तुरंत और कॉल करके कक्षा को उसी तरह चला सकते हैं CreateUsers.new.change
VinnyQ77

13

जैसे rails 5आप के railsबजाय का उपयोग कर सकते हैंrake

रेल 3 - 4

# < rails-5.0
rake db:migrate:up VERSION=20160920130051

रेलें ५

# >= rails-5.0
rake db:migrate:up VERSION=20160920130051

# or

rails db:migrate:up VERSION=20160920130051

1
यह भी अनुमान लगाता है कि आपको क्या जरूरत हैrails db:migrate VERSION=20160920130051
frenesim

12

यदि आप उन रास्तों से परेशान हैं जिनका आप उपयोग कर सकते हैं

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'

6

विधि 1:

rake db:migrate:up VERSION=20080906120000

विधि 2:

रेल कंसोल में 1. कंसोल में माइग्रेशन क्लास को कॉपी करें (Add_name_to_user.rb कहते हैं) 2. फिर कंसोल में, निम्न टाइप करें

Sharding.run_on_all_shards{AddNameToUser.up}

हो गया है!!


5

कृपया ध्यान दें कि इसके बजाय script/runner, आपको rails runnerनए रेल वातावरण पर उपयोग करना पड़ सकता है ।


3

यदि आप इसे कंसोल से चलाना चाहते हैं, तो आप इसे देख रहे हैं:

$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)

मैंने अन्य उत्तरों की कोशिश की, लेकिन Rails.rootमेरे लिए काम नहीं किए बिना आवश्यकता थी ।

इसके अलावा, .migrate(:up)भाग को फिर से चलाने के लिए बाध्य करता है, भले ही वह पहले से चला हो या नहीं। यह तब उपयोगी होता है जब आप पहले से ही एक माइग्रेशन चलाते थे, थोड़े समय के लिए इसे डीबी के साथ गड़बड़ करके पूर्ववत कर दिया था और इसे फिर से शुरू करने के लिए एक त्वरित समाधान चाहते हैं।


1

कम से कम नवीनतम रेल रिलीज़ (लेखन के समय 5.2) में ऐसा लगता है कि पलायन किए गए पलायन को फ़िल्टर करने का एक और तरीका है। एक SCOPEपर्यावरण चर में एक फिल्टर पारित कर सकता है जो तब माइग्रेशन फ़ाइलों का चयन करने के लिए उपयोग किया जाएगा।

मान लें कि आपके पास दो माइग्रेशन फ़ाइलें हैं 1_add_foos.rbऔर 2_add_foos.run_this_one.rbचल रही हैं

SCOPE=run_this_one rails db:migrate:up

केवल चयन और चलाएगा 2_add_foos.run_this_one.rb। ध्यान रखें कि गुंजाइश से मेल खाने वाली सभी माइग्रेशन फाइलें चलाई जाएंगी।

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