เรียกใช้ไฟล์การโยกย้ายเดียว


267

มีวิธีง่าย ๆ ในการเรียกใช้การย้ายครั้งเดียวหรือไม่ ฉันไม่ต้องการย้ายไปเป็นเวอร์ชันที่ฉันต้องการเรียกใช้เฉพาะรุ่น


นี่คือบางสิ่งที่คุณเรียกใช้ครั้งเดียวในฐานะการย้ายข้อมูลเนื่องจากจำเป็นต้องใช้แล้วกลายเป็นแบบสอบถามที่มีประโยชน์ที่อาจต้องเรียกใช้หลายครั้งหรือไม่ บางทีคุณควรปรับโครงสร้างเนื้อหาของการย้ายข้อมูลให้เป็นแบบจำลองหรือวัตถุอื่น ๆ จากนั้นให้มีการอ้างอิงการโยกย้ายตำแหน่งใหม่ จากนั้นคุณสามารถเรียกใช้งานวัตถุใหม่ที่ lesure ของคุณโดยการเรียก ruby ​​บนบรรทัดคำสั่ง
นาธาน Feger

คำตอบ:


240

คุณสามารถเรียกใช้รหัสโดยตรงจากไฟล์ทับทิม:

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

หมายเหตุ: รุ่นใหม่ของทางรถไฟอาจต้องใช้มากกว่าAddFoos.new.upAddFoos.up

ทางเลือกอื่น (โดยไม่มี IRB) ซึ่งขึ้นอยู่กับข้อเท็จจริงที่ต้องการส่งคืนอาร์เรย์ของชื่อคลาส:

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

โปรดทราบว่าหากคุณทำเช่นนี้อาจไม่อัปเดตschema_migrationsตาราง แต่ดูเหมือนว่าเป็นสิ่งที่คุณต้องการอยู่แล้ว


59
บางครั้งคุณต้องใช้ './' ด้านหน้าพา ธ ที่ต้องการและแน่นอนไม่ได้อัปเดต schema_migrations
Beardo

14
ฉันต้องสร้างตัวอย่างของวัตถุการโยกย้ายก่อนที่ฉันจะเรียกได้ เช่นAddFoos.new.up
Bentleyo

15
ดังนั้นสรุปโดยรวมสำหรับ Rails 3.2: require "./db/migrate/db/migrate/20090408054532_add_foos.rb"แล้วAddFoos.new.up
trisweb

50
หากการย้ายข้อมูลของคุณใช้changeแทนupและdownคุณจะต้องเรียกใช้AddFoos.new.migrate(:up)
Don Werve

6
ใน Rails 4 คุณสามารถโทรAddFoos.new.change
lfender6445

429

สมมติว่า Rails เป็นเวอร์ชั่นล่าสุดที่คุณสามารถเรียกใช้ได้:

rake db:migrate:up VERSION=20090408054532

โดยที่ version คือการประทับเวลาในชื่อไฟล์ของการย้ายข้อมูล

แก้ไข: ในบางจุดในช่วง 8 ปีที่ผ่านมา (ฉันไม่แน่ใจว่าเป็นเวอร์ชั่นใด) เพิ่มรางตรวจสอบที่ป้องกันไม่ให้ทำงานหากมีการเรียกใช้แล้ว สิ่งนี้ถูกระบุโดยรายการในschema_migrationsตาราง หากต้องการเรียกใช้ซ้ำเพียงดำเนินการrake db:migrate:redo VERSION=20090408054532แทน


124
จริงๆแล้วคำสั่งคือ rake db: migrate: redo VERSION = my_version
Chirag Patel

2
@ Chirag Patel: นั่นคือสิ่งที่ฉันกำลังมองหา! ขอบคุณ!
Abel

23
ทำซ้ำจะเรียกใช้วิธีการลงของการโยกย้ายที่กำหนดและวิธีการขึ้นหลังจากนั้น up ทำงานเฉพาะ up-method และฉันคิดว่านั่นเป็นสิ่งที่ผู้ขอต้องการ
Sven Koschnicke

7
'up' ดูเหมือนจะไม่ทำงานหากเวอร์ชันสคีมาฐานข้อมูลช้ากว่าการย้ายข้อมูลที่เป็นปัญหาซึ่งสามารถเกิดขึ้นได้เมื่อรวมการเปลี่ยนแปลงของบุคคลอื่นเข้าด้วยกัน
Matt Connolly

3
ขอบคุณฉันใช้มันลงด้วยrake db:migrate:down VERSION=XXX
Nitrodist

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วิธีการย้ายข้อมูลของ nuked อีกครั้ง


ทั้ง "up" และ "redo" ไม่ได้ผลสำหรับฉัน แต่การลบแถวใน schema_migrations นั้นสมบูรณ์แบบ
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. เรียกใช้โหมดคอนโซล (ราง c)
  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
frenesim


6

วิธีที่ 1:

rake db:migrate:up VERSION=20080906120000

วิธีที่ 2:

ใน Rails Console 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)ส่วนที่บังคับให้การโยกย้ายเพื่อรันใหม่โดยไม่คำนึงว่ามันได้ทำงานแล้วหรือไม่ สิ่งนี้มีประโยชน์เมื่อคุณทำการโอนย้ายข้อมูลแล้วให้ทำการเลิกทำได้โดยไปยุ่งกับ db และต้องการวิธีแก้ปัญหาอย่างรวดเร็วเพื่อให้มันกลับมาทำงานอีกครั้ง


1

ดูเหมือนว่าอย่างน้อยในรีลีสล่าสุดของ 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จะเลือกใช้เฉพาะ โปรดทราบว่าไฟล์การโยกย้ายทั้งหมดที่ตรงกับขอบเขตจะถูกเรียกใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.