มีวิธีง่าย ๆ ในการเรียกใช้การย้ายครั้งเดียวหรือไม่ ฉันไม่ต้องการย้ายไปเป็นเวอร์ชันที่ฉันต้องการเรียกใช้เฉพาะรุ่น
มีวิธีง่าย ๆ ในการเรียกใช้การย้ายครั้งเดียวหรือไม่ ฉันไม่ต้องการย้ายไปเป็นเวอร์ชันที่ฉันต้องการเรียกใช้เฉพาะรุ่น
คำตอบ:
คุณสามารถเรียกใช้รหัสโดยตรงจากไฟล์ทับทิม:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
หมายเหตุ: รุ่นใหม่ของทางรถไฟอาจต้องใช้มากกว่าAddFoos.new.up
AddFoos.up
ทางเลือกอื่น (โดยไม่มี IRB) ซึ่งขึ้นอยู่กับข้อเท็จจริงที่ต้องการส่งคืนอาร์เรย์ของชื่อคลาส:
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
สมมติว่า Rails เป็นเวอร์ชั่นล่าสุดที่คุณสามารถเรียกใช้ได้:
rake db:migrate:up VERSION=20090408054532
โดยที่ version คือการประทับเวลาในชื่อไฟล์ของการย้ายข้อมูล
แก้ไข: ในบางจุดในช่วง 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
วิธีการย้ายข้อมูลของ nuked อีกครั้ง
หากคุณใช้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
ราง 5
# >= 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'
วิธีที่ 1:
rake db:migrate:up VERSION=20080906120000
วิธีที่ 2:
ใน Rails Console 1. คัดลอกวางคลาสการย้ายข้อมูลในคอนโซล (พูด add_name_to_user.rb) 2. จากนั้นในคอนโซลพิมพ์ต่อไปนี้
Sharding.run_on_all_shards{AddNameToUser.up}
เสร็จแล้ว !!
โปรดสังเกตุว่าแทนที่จะ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)
ส่วนที่บังคับให้การโยกย้ายเพื่อรันใหม่โดยไม่คำนึงว่ามันได้ทำงานแล้วหรือไม่ สิ่งนี้มีประโยชน์เมื่อคุณทำการโอนย้ายข้อมูลแล้วให้ทำการเลิกทำได้โดยไปยุ่งกับ db และต้องการวิธีแก้ปัญหาอย่างรวดเร็วเพื่อให้มันกลับมาทำงานอีกครั้ง
ดูเหมือนว่าอย่างน้อยในรีลีสล่าสุดของ Rails (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
จะเลือกใช้เฉพาะ โปรดทราบว่าไฟล์การโยกย้ายทั้งหมดที่ตรงกับขอบเขตจะถูกเรียกใช้