একটি একক স্থানান্তর ফাইল চালান


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
সুতরাং, require "./db/migrate/db/migrate/20090408054532_add_foos.rb"AddFoos.new.up
R.২

50
যদি আপনার মাইগ্রেশন এর changeপরিবর্তে upএবং ব্যবহার করে তবে আপনার downচালানো দরকারAddFoos.new.migrate(:up)
ডন ওয়ারভে

6
রেল 4 এ, আপনি কল করতে পারেনAddFoos.new.change
lfender6445

429

রেলের মোটামুটি সাম্প্রতিক সংস্করণ ধরে নেওয়া আপনি সর্বদা চালাতে পারেন:

rake db:migrate:up VERSION=20090408054532

যেখানে সংস্করণ হ'ল মাইগ্রেশনের ফাইলনামে টাইমস্ট্যাম্প।

সম্পাদনা করুন: গত আট বছরে কোন এক সময় (আমি নিশ্চিত না যে কোনও সংস্করণ) রেলগুলি এমন চেক যুক্ত করেছে যা এটি ইতিমধ্যে চালানো থাকলে এটি চলতে বাধা দেয়। এটি schema_migrationsসারণীতে একটি এন্ট্রি দ্বারা নির্দেশিত হয় । এটি পুনরায় চালাতে, কেবল rake db:migrate:redo VERSION=20090408054532পরিবর্তে সম্পাদন করুন।


124
আসলে কমান্ডটি রেক ডিবি: মাইগ্রেট করুন: পুনরায় সংস্করণ = আমার_বর্ধন
চিরাগ প্যাটেল

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ন্যোকড মাইগ্রেশনগুলির পদ্ধতিটি পুনরায় চালু করা হবে ।


"আপ" এবং "পুনরায়" উভয়ই আমার পক্ষে কাজ করেনি, তবে স্কিমা_মাইগ্রেশনগুলিতে সারিটি মোছা নিখুঁত ছিল।
সিউসয়েড

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

রেল 5

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

# or

rails db:migrate:up VERSION=20160920130051

1
এটি আপনার কী প্রয়োজন তা অনুমান করেrails db:migrate VERSION=20160920130051
ফ্রেসিম


6

পদ্ধতি 1:

rake db:migrate:up VERSION=20080906120000

পদ্ধতি 2:

রেলস কনসোলে ১. মাইগ্রেশন ক্লাসটি অনুলিপি করে কনসোলে পেস্ট করুন (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.rootrequ

এছাড়াও, .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 । মনে রাখবেন যে স্কোপের সাথে মেলে সমস্ত মাইগ্রেশন ফাইলগুলি রান করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.