ฉันมีไฟล์การโยกย้ายดังต่อไปนี้ db\migrate\20100905201547_create_blocks.rb
ฉันจะย้อนกลับแฟ้มการโยกย้ายนั้นโดยเฉพาะได้อย่างไร
ฉันมีไฟล์การโยกย้ายดังต่อไปนี้ db\migrate\20100905201547_create_blocks.rb
ฉันจะย้อนกลับแฟ้มการโยกย้ายนั้นโดยเฉพาะได้อย่างไร
คำตอบ:
rake db:rollback STEP=1
เป็นวิธีในการทำเช่นนี้หากการโยกย้ายที่คุณต้องการย้อนกลับเป็นวิธีสุดท้ายที่ใช้ คุณสามารถแทนที่ 1 สำหรับการย้ายข้อมูลจำนวนมากที่คุณต้องการย้อนกลับ
ตัวอย่างเช่น:
rake db:rollback STEP=5
จะย้อนกลับการโยกย้ายทั้งหมดที่เกิดขึ้นในภายหลัง (4, 3, 2 และ 1)
ในการย้อนกลับการโยกย้ายทั้งหมดกลับไปที่ (และรวมถึง) การโยกย้ายเป้าหมายให้ใช้: (คำสั่งที่ถูกแก้ไขนี้ได้รับการเพิ่มหลังจากความคิดเห็นทั้งหมดชี้ให้เห็นข้อผิดพลาดในโพสต์ต้นฉบับ)
rake db:migrate VERSION=20100905201547
เพื่อที่จะย้อนกลับใช้การโยกย้ายที่เฉพาะเจาะจงเพียงครั้งเดียว (ออกจากคำสั่งซื้อ):
rake db:migrate:down VERSION=20100905201547
โปรดทราบว่าการดำเนินการนี้จะไม่ย้อนกลับการย้ายข้อมูลใด ๆ หากนั่นไม่ใช่สิ่งที่คุณตั้งใจคุณสามารถเรียกใช้ได้อย่างปลอดภัยrake db:migrate
และจะเรียกใช้อีกครั้งโดยข้ามสิ่งอื่นที่ไม่ได้ย้อนกลับไปก่อนหน้านี้
และถ้าคุณต้องการโยกย้ายการโยกย้ายครั้งเดียวไม่เป็นไปตามที่กำหนดก็จะมีการกลับdb:migrate:up
กัน
rake db:migrate:up VERSION=20100905201547
STEP=-1
ไม่เคยทำ ฉันทำอย่างนั้นครั้งเดียวและมันก็บ้าไปแล้ว ไม่ดี! นี่คือ Rails 4.2 - ฉันคิดว่ามันคงได้รับการแก้ไขแล้วในตอนนี้
rake db:migrate:down VERSION=20100905201547
จะย้อนกลับไฟล์เฉพาะ
หากต้องการค้นหาเวอร์ชันของการย้ายข้อมูลทั้งหมดคุณสามารถใช้คำสั่งนี้:
rake db:migrate:status
หรือเพียงนำหน้าชื่อไฟล์ของการโยกย้ายเป็นเวอร์ชันที่คุณต้องย้อนกลับ
ดูรายการคู่มือ Ruby on Railsเกี่ยวกับการย้ายข้อมูล
ในการย้อนการโยกย้ายครั้งล่าสุดคุณสามารถทำได้:
rake db:rollback
หากคุณต้องการย้อนกลับการโยกย้ายที่ระบุด้วยรุ่นที่คุณควรทำ:
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
ตัวอย่างเช่นถ้าเวอร์ชั่น 20141201122027 คุณจะทำ:
rake db:migrate:down VERSION=20141201122027
เพื่อย้อนกลับการโยกย้ายที่เฉพาะเจาะจง
คุณสามารถย้อนกลับการโยกย้ายของคุณโดยใช้ rake db:rollback
กับตัวเลือกที่แตกต่างกัน ไวยากรณ์จะแตกต่างกันตามความต้องการของคุณ
หากคุณต้องการย้อนกลับเฉพาะการโยกย้ายครั้งล่าสุดคุณสามารถใช้
rake db:rollback
หรือ
rake db:rollback STEP=1
หากคุณต้องการย้อนกลับจำนวนการย้ายถิ่นในคราวเดียวคุณก็จะผ่านการโต้แย้ง:
rake db:rollback STEP=n
โดยที่n
จำนวนการย้ายข้อมูลไปยังการย้อนกลับนับจากการโยกย้ายครั้งล่าสุด
หากคุณต้องการย้อนกลับไปที่การโยกย้ายที่เฉพาะเจาะจงคุณควรผ่านรุ่นของการโยกย้ายในต่อไปนี้:
rake db:migrate:down VERSION=xxxxx
โดย xxxxx คือหมายเลขเวอร์ชันของการย้ายข้อมูล
rake db:migrate:down VERSION=your_migrations's_version_number_here
เวอร์ชันเป็นส่วนนำหน้าตัวเลขในชื่อไฟล์ของการย้ายข้อมูล
วิธีค้นหารุ่น :
ไฟล์การโยกย้ายของคุณจะถูกเก็บไว้ในrails_root/db/migrate
ไดเรกทอรีของคุณ ค้นหาไฟล์ที่เหมาะสมที่คุณต้องการย้อนกลับและคัดลอกหมายเลขคำนำหน้า
ตัวอย่างเช่น
ชื่อไฟล์: 20140208031131_create_roles.rb
จากนั้นเวอร์ชันคือ20140208031131
rake db:migrate:status
ย้อนกลับการโยกย้ายครั้งล่าสุด:
# rails < 5.0
rake db:rollback
# rails >= 5.0
rake db:rollback
# or
rails db:rollback
ย้อนกลับn
จำนวนการย้ายข้อมูลครั้งล่าสุด
# rails < 5.0
rake db:rollback STEP=2
# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2
ย้อนกลับการโยกย้ายที่เฉพาะเจาะจง
# rails < 5.0
rake db:migrate:down VERSION=20100905201547
# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547
ในการย้อนการโยกย้ายครั้งล่าสุดคุณสามารถทำได้:
rake db:rollback
หากคุณต้องการย้อนกลับการโยกย้ายที่ระบุด้วยรุ่นที่คุณควรทำ:
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
หากไฟล์การโยกย้ายที่คุณต้องการย้อนกลับถูกเรียกdb/migrate/20141201122027_create_some_table.rb
ใช้เวอร์ชัน VERSION สำหรับการย้ายนั้นคือ20141201122027
ซึ่งเป็นเวลาประทับของเวลาที่การโยกย้ายนั้นถูกสร้างขึ้นและคำสั่งเพื่อย้อนกลับการโยกย้ายนั้นจะเป็น:
rake db:migrate:down VERSION=20141201122027
หากเป็นการโยกย้ายแบบย้อนกลับได้และรายการสุดท้ายที่ถูกดำเนินการให้เรียกใช้ rake db:rollback
ถ้าเป็นการย้ายถิ่นกลับได้และคนสุดท้ายที่ได้รับการดำเนินการแล้วเรียกใช้และคุณสามารถใช้เวอร์ชันได้ตลอดเวลา เช่น
ไฟล์การโอนย้ายคือ 20140716084539_create_customer_stats.rb ดังนั้นคำสั่ง rollback จะเป็น
rake db:migrate:down VERSION=20140716084539
หากต้องการย้อนกลับการย้ายข้อมูลทั้งหมดเป็นเวอร์ชันเฉพาะ (เช่น20181002222222
) ให้ใช้:
rake db:migrate VERSION=20181002222222
(โปรดทราบว่าสิ่งนี้ใช้db:migrate
- ไม่db:migrate:down
เหมือนกับคำตอบอื่น ๆ ของคำถามนี้)
สมมติว่าเวอร์ชันการโยกย้ายที่ระบุนั้นเก่ากว่าเวอร์ชันปัจจุบันนี่จะย้อนกลับการโอนย้ายทั้งหมดจนถึง แต่ไม่รวมถึงเวอร์ชันที่ระบุ
ตัวอย่างเช่นถ้าrake db:migrate:status
เริ่มแสดง:
(... some older migrations ...)
up 20181001002039 Some migration description
up 20181002222222 Some migration description
up 20181003171932 Some migration description
up 20181004211151 Some migration description
up 20181005151403 Some migration description
วิ่ง:
rake db:migrate VERSION=20181002222222
จะส่งผลให้:
(... some older migrations ...)
up 20181001002039 Some migration description
up 20181002222222 Some migration description
down 20181003171932 Some migration description
down 20181004211151 Some migration description
down 20181005151403 Some migration description
การอ้างอิง: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations
จากคู่มือรถไฟ
คุณสามารถใช้ความสามารถของ Active Record ในการย้อนการโยกย้ายโดยใช้revert
วิธีการ:
require_relative '20100905201547_create_blocks'
class FixupCreateBlock < ActiveRecord::Migration
def change
revert CreateBlock
create_table(:apples) do |t|
t.string :variety
end
end
end
revert
วิธียังยอมรับบล็อกของคำแนะนำในการย้อนกลับ สิ่งนี้อาจมีประโยชน์ในการคืนค่าบางส่วนของการย้ายข้อมูลก่อนหน้านี้ ตัวอย่างเช่นสมมติว่า CreateBlock ได้รับการกำหนดและมีการตัดสินใจในภายหลังว่าจะเป็นการดีที่สุดที่จะใช้การตรวจสอบความถูกต้องของเรกคอร์ดแทนข้อ จำกัด การตรวจสอบเพื่อตรวจสอบรหัสไปรษณีย์
class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
def change
revert do
# copy-pasted code from CreateBlock
reversible do |dir|
dir.up do
# add a CHECK constraint
execute <<-SQL
ALTER TABLE distributors
ADD CONSTRAINT zipchk
CHECK (char_length(zipcode) = 5);
SQL
end
dir.down do
execute <<-SQL
ALTER TABLE distributors
DROP CONSTRAINT zipchk
SQL
end
end
# The rest of the migration was ok
end
end
end
การโอนย้ายแบบเดียวกันสามารถเขียนได้โดยไม่ใช้การย้อนกลับ แต่สิ่งนี้จะเกี่ยวข้องกับขั้นตอนเพิ่มเติมไม่กี่ขั้นตอน: การกลับคำสั่งของ create_table และย้อนกลับได้การแทนที่ create_table โดย drop_table และในที่สุดก็เปลี่ยนขึ้นและลงในทางกลับกัน ทั้งหมดนี้ได้รับการดูแลโดยการเปลี่ยนกลับ
การโอนย้ายเปลี่ยนสถานะของฐานข้อมูลโดยใช้คำสั่ง
$ bundle exec rake db:migrate
เราสามารถเลิกทำการโอนย้ายขั้นตอนเดียวได้
$ bundle exec rake db:rollback
ในการกลับไปสู่จุดเริ่มต้นเราสามารถใช้
$ bundle exec rake db:migrate VERSION=0
ในขณะที่คุณอาจเดาได้ว่าการแทนที่หมายเลขอื่นใดสำหรับ 0 การโยกย้ายไปยังหมายเลขรุ่นนั้นซึ่งหมายเลขรุ่นมาจากการแสดงรายการการย้ายข้อมูลตามลำดับ
ในรางที่ 5 มันง่ายมากคราด db: migrate: status หรือ rails db: migrate: status
มันได้รับการแก้ไขเพื่อจัดการทั้งสองวิธีเดียวกันจากนั้นเพียงเลือกเวอร์ชันที่คุณต้องการย้อนกลับจากนั้นเรียกใช้ rake db: migrate VERSION = 2013424230423
ตรวจสอบให้แน่ใจว่า VERSION เป็นตัวพิมพ์ใหญ่ทั้งหมด
หากคุณมีปัญหากับขั้นตอนใด ๆ ของการโยกย้ายหรือติดอยู่ตรงกลางเพียงแค่ไปที่ไฟล์การโยกย้ายและแสดงความคิดเห็นบรรทัดที่ถูกโยกย้ายแล้ว
หวังว่าจะช่วย
หากคุณต้องการย้อนกลับและย้ายข้อมูลคุณสามารถเรียกใช้:
rake db:migrate:redo
นั่นเป็นเช่นเดียวกับ:
rake db:rollback
rake db:migrate
Class.down
stackoverflow.com/questions/753919/run-a-single-migration-file