क्या एकल प्रवास चलाने का एक आसान तरीका है? मैं एक निश्चित संस्करण में स्थानांतरित नहीं करना चाहता, जिसे मैं केवल एक विशिष्ट चलाना चाहता हूं।
क्या एकल प्रवास चलाने का एक आसान तरीका है? मैं एक निश्चित संस्करण में स्थानांतरित नहीं करना चाहता, जिसे मैं केवल एक विशिष्ट चलाना चाहता हूं।
जवाबों:
आप बस रूबी फ़ाइल से सीधे कोड चला सकते हैं:
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
तालिका को अपडेट नहीं करेगा , लेकिन ऐसा लगता है कि आप वैसे भी चाहते हैं।
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
फिरAddFoos.new.up
change
के बजाय up
और down
, आप चलाने की आवश्यकता होगीAddFoos.new.migrate(:up)
AddFoos.new.change
रेल के हालिया संस्करण को मानकर आप हमेशा दौड़ सकते हैं:
rake db:migrate:up VERSION=20090408054532
जहाँ संस्करण माइग्रेशन के फ़ाइलनाम में टाइमस्टैम्प है।
संपादित करें: पिछले 8 वर्षों में कुछ बिंदु पर (मुझे यकीन नहीं है कि कौन सा संस्करण है) रेल्स ने चेक जोड़े हैं जो इसे चलाने से रोकते हैं यदि यह पहले से ही चलाया जा चुका है। यह schema_migrations
तालिका में एक प्रविष्टि द्वारा इंगित किया गया है। इसे फिर से चलाने के लिए, rake db:migrate:redo VERSION=20090408054532
इसके बजाय बस निष्पादित करें ।
rake db:migrate:down VERSION=XXX
यदि आप एक विशिष्ट माइग्रेशन चलाना चाहते हैं , तो करें
$ 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
रुके हुए पलायन की विधि का पुनर्मिलन होगा।
यदि आपने 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)
up
और यह भी लागू होता है down
।
यह माइग्रेशन फ़ाइल "20150927161307_create_users.rb" को फिर से चलाने के लिए चरण हैं
उस फ़ाइल में कंसोल में उस क्लास को कॉपी और पेस्ट करें।
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
कक्षा का एक उदाहरण बनाएँ CreateUsers
:c1 = CreateUsers.new
change
उस उदाहरण की विधि निष्पादित करें :c1.change
require "./db/migrate/20150927161307_create_users.rb"
कॉपी और पेस्ट करने के बजाय। फिर आप कक्षा में परिभाषित विधि को तुरंत और कॉल करके कक्षा को उसी तरह चला सकते हैं CreateUsers.new.change
।
जैसे 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
rails db:migrate VERSION=20160920130051
यदि आप उन रास्तों से परेशान हैं जिनका आप उपयोग कर सकते हैं
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
कृपया ध्यान दें कि इसके बजाय script/runner
, आपको rails runner
नए रेल वातावरण पर उपयोग करना पड़ सकता है ।
यदि आप इसे कंसोल से चलाना चाहते हैं, तो आप इसे देख रहे हैं:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
मैंने अन्य उत्तरों की कोशिश की, लेकिन Rails.root
मेरे लिए काम नहीं किए बिना आवश्यकता थी ।
इसके अलावा, .migrate(:up)
भाग को फिर से चलाने के लिए बाध्य करता है, भले ही वह पहले से चला हो या नहीं। यह तब उपयोगी होता है जब आप पहले से ही एक माइग्रेशन चलाते थे, थोड़े समय के लिए इसे डीबी के साथ गड़बड़ करके पूर्ववत कर दिया था और इसे फिर से शुरू करने के लिए एक त्वरित समाधान चाहते हैं।
कम से कम नवीनतम रेल रिलीज़ (लेखन के समय 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
। ध्यान रखें कि गुंजाइश से मेल खाने वाली सभी माइग्रेशन फाइलें चलाई जाएंगी।