क्या एकल प्रवास चलाने का एक आसान तरीका है? मैं एक निश्चित संस्करण में स्थानांतरित नहीं करना चाहता, जिसे मैं केवल एक विशिष्ट चलाना चाहता हूं।
क्या एकल प्रवास चलाने का एक आसान तरीका है? मैं एक निश्चित संस्करण में स्थानांतरित नहीं करना चाहता, जिसे मैं केवल एक विशिष्ट चलाना चाहता हूं।
जवाबों:
आप बस रूबी फ़ाइल से सीधे कोड चला सकते हैं:
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.changerequire "./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। ध्यान रखें कि गुंजाइश से मेल खाने वाली सभी माइग्रेशन फाइलें चलाई जाएंगी।