วิธีย้อนกลับการโยกย้ายที่เฉพาะเจาะจง


807

ฉันมีไฟล์การโยกย้ายดังต่อไปนี้ db\migrate\20100905201547_create_blocks.rb

ฉันจะย้อนกลับแฟ้มการโยกย้ายนั้นโดยเฉพาะได้อย่างไร


1
ที่อยู่นี้เป็นปัญหาหรือไม่ คุณเพียงแค่ต้องทำClass.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich

4
ข้อมูลเกี่ยวกับการย้ายถิ่นทุกครั้งที่นี่
Nishutosh Sharma

1
คุณต้องการย้อนกลับเฉพาะการโยกย้ายที่เฉพาะเจาะจงนั้น (แม้ว่าจะมีการโยกย้ายที่ใหม่กว่าหลังจากนั้น) หรือคุณต้องการย้อนกลับฐานข้อมูลกลับสู่สถานะที่เคยมีมาก่อนการโอนย้ายระบบและการย้ายข้อมูลที่ตามมาใด ๆ
Jon Schneider

คำตอบ:


1340
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

14
"เพื่อย้อนกลับไปยังรุ่นที่ระบุ" - คำสั่งที่ไม่ติดตามการย้อนกลับเฉพาะการโยกย้ายที่เฉพาะเจาะจงมากกว่าที่จะย้อนกลับไปสู่เวอร์ชันนั้นหรือไม่
Andrew Grimm

10
"เพื่อย้อนกลับไปยังรุ่นที่ระบุใช้ ... " คำตอบนี้ไม่ถูกต้อง! สิ่งนี้จะย้อนการโยกย้ายในการแยกตามที่อธิบายโดยคำตอบอื่น ๆ
Rhys van der Waerden

3
คำเตือน: ฉันทำผิดพลาดนี้: ใช้ rake db: migrate: down VERSION = 20100905201547 เพื่อย้อนกลับในการแยก !!! ไฟล์การโยกย้ายหนึ่งไฟล์ สิ่งนี้ถูกกล่าวถึงในความคิดเห็นด้านบน แต่ฉันพลาดไป
พิกเซลที่

3
คำหนึ่งของคำเตือน - STEP=-1ไม่เคยทำ ฉันทำอย่างนั้นครั้งเดียวและมันก็บ้าไปแล้ว ไม่ดี! นี่คือ Rails 4.2 - ฉันคิดว่ามันคงได้รับการแก้ไขแล้วในตอนนี้
Dave Hartnoll

1
เขียนบทความในบล็อกของฉันเกี่ยวกับการย้ายข้อมูลซึ่งจะอธิบายวิธีและเวลาที่จะใช้คำสั่งเหล่านี้: railsguides.net/polish-rails-migrations
ka8725

867
rake db:migrate:down VERSION=20100905201547

จะย้อนกลับไฟล์เฉพาะ


หากต้องการค้นหาเวอร์ชันของการย้ายข้อมูลทั้งหมดคุณสามารถใช้คำสั่งนี้:

rake db:migrate:status

หรือเพียงนำหน้าชื่อไฟล์ของการโยกย้ายเป็นเวอร์ชันที่คุณต้องย้อนกลับ


ดูรายการคู่มือ Ruby on Railsเกี่ยวกับการย้ายข้อมูล


48
แน่นอนคำตอบที่ต้องการในความคิดของฉัน
streetlogics

30
เป็นมูลค่าการกล่าวขวัญว่าถ้าคุณย้อนกลับการโยกย้ายที่เฉพาะเจาะจงและไม่ต้องการที่จะโยกย้ายอีกครั้งในงานที่จะเกิดขึ้นคราดแล้วลบไฟล์โยกย้ายเช่นกัน
BradGreens

4
หมายเหตุ: ดูเหมือนว่าหากการโยกย้ายขึ้นไม่เคยประสบความสำเร็จ แต่มีเพียงบางส่วนที่ดำเนินการลงไม่ทำอะไรเลย
cyrilchampier

1
@ ภายในนั้นอาจเป็นจริงสำหรับฐานข้อมูลที่ไม่รองรับ DDL ของทรานแซคชัน MySQL ไม่รองรับ Transactional DDL: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL ทำเช่นนั้น: wiki.postgresql.org/wiki/ ดังนั้นถ้าการย้ายฐานข้อมูล MySQL ของคุณเสีย คุณต้องลบบางส่วนของการโยกย้ายด้วยตนเองด้วยตนเอง
ИванБишевац

1
ข้อสังเกตอีกประการเกี่ยวกับความคิดเห็น @BradGreens หากคุณต้องการลบไฟล์การโยกย้ายและมีการปรับใช้แล้วคุณจะต้องย้อนกลับการผลิต / การจัดเตรียมก่อนที่จะส่งรหัสด้วยไฟล์ที่ถูกลบ ไม่เช่นนั้นคุณจะไม่สามารถย้อนกลับ / ย้ายข้อมูล: ลง
AdamT

57

ในการย้อนการโยกย้ายครั้งล่าสุดคุณสามารถทำได้:

rake db:rollback

หากคุณต้องการย้อนกลับการโยกย้ายที่ระบุด้วยรุ่นที่คุณควรทำ:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

ตัวอย่างเช่นถ้าเวอร์ชั่น 20141201122027 คุณจะทำ:

rake db:migrate:down VERSION=20141201122027

เพื่อย้อนกลับการโยกย้ายที่เฉพาะเจาะจง


32

คุณสามารถย้อนกลับการโยกย้ายของคุณโดยใช้ rake db:rollbackกับตัวเลือกที่แตกต่างกัน ไวยากรณ์จะแตกต่างกันตามความต้องการของคุณ

หากคุณต้องการย้อนกลับเฉพาะการโยกย้ายครั้งล่าสุดคุณสามารถใช้

rake db:rollback

หรือ

rake db:rollback STEP=1

หากคุณต้องการย้อนกลับจำนวนการย้ายถิ่นในคราวเดียวคุณก็จะผ่านการโต้แย้ง:

rake db:rollback STEP=n

โดยที่nจำนวนการย้ายข้อมูลไปยังการย้อนกลับนับจากการโยกย้ายครั้งล่าสุด

หากคุณต้องการย้อนกลับไปที่การโยกย้ายที่เฉพาะเจาะจงคุณควรผ่านรุ่นของการโยกย้ายในต่อไปนี้:

rake db:migrate:down VERSION=xxxxx

โดย xxxxx คือหมายเลขเวอร์ชันของการย้ายข้อมูล


1
เพิ่ม: ลงไม่ทำงานแม้ว่าคำตอบที่ถูกต้องคือไม่ลง
Elta3lab

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

เวอร์ชันเป็นส่วนนำหน้าตัวเลขในชื่อไฟล์ของการย้ายข้อมูล

วิธีค้นหารุ่น :

ไฟล์การโยกย้ายของคุณจะถูกเก็บไว้ในrails_root/db/migrateไดเรกทอรีของคุณ ค้นหาไฟล์ที่เหมาะสมที่คุณต้องการย้อนกลับและคัดลอกหมายเลขคำนำหน้า

ตัวอย่างเช่น

ชื่อไฟล์: 20140208031131_create_roles.rb จากนั้นเวอร์ชันคือ20140208031131


6
วิธีที่ง่ายที่สุดในการค้นหารหัสการโยกย้ายคือการเรียกใช้rake db:migrate:status
Aeradriel

18

ย้อนกลับการโยกย้ายครั้งล่าสุด:

# 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

14

ในการย้อนการโยกย้ายครั้งล่าสุดคุณสามารถทำได้:

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

6

หากเป็นการโยกย้ายแบบย้อนกลับได้และรายการสุดท้ายที่ถูกดำเนินการให้เรียกใช้ rake db:rollbackถ้าเป็นการย้ายถิ่นกลับได้และคนสุดท้ายที่ได้รับการดำเนินการแล้วเรียกใช้และคุณสามารถใช้เวอร์ชันได้ตลอดเวลา เช่น

ไฟล์การโอนย้ายคือ 20140716084539_create_customer_stats.rb ดังนั้นคำสั่ง rollback จะเป็น rake db:migrate:down VERSION=20140716084539


6

หากต้องการย้อนกลับการย้ายข้อมูลทั้งหมดเป็นเวอร์ชันเฉพาะ (เช่น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


4

จากคู่มือรถไฟ

การคืนค่าการย้ายข้อมูลก่อนหน้า

คุณสามารถใช้ความสามารถของ 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 และในที่สุดก็เปลี่ยนขึ้นและลงในทางกลับกัน ทั้งหมดนี้ได้รับการดูแลโดยการเปลี่ยนกลับ


3

การโอนย้ายเปลี่ยนสถานะของฐานข้อมูลโดยใช้คำสั่ง

$ bundle exec rake db:migrate

เราสามารถเลิกทำการโอนย้ายขั้นตอนเดียวได้

  $ bundle exec rake db:rollback

ในการกลับไปสู่จุดเริ่มต้นเราสามารถใช้

  $ bundle exec rake db:migrate VERSION=0

ในขณะที่คุณอาจเดาได้ว่าการแทนที่หมายเลขอื่นใดสำหรับ 0 การโยกย้ายไปยังหมายเลขรุ่นนั้นซึ่งหมายเลขรุ่นมาจากการแสดงรายการการย้ายข้อมูลตามลำดับ


2

ในรางที่ 5 มันง่ายมากคราด db: migrate: status หรือ rails db: migrate: status

มันได้รับการแก้ไขเพื่อจัดการทั้งสองวิธีเดียวกันจากนั้นเพียงเลือกเวอร์ชันที่คุณต้องการย้อนกลับจากนั้นเรียกใช้ rake db: migrate VERSION = 2013424230423

ตรวจสอบให้แน่ใจว่า VERSION เป็นตัวพิมพ์ใหญ่ทั้งหมด

หากคุณมีปัญหากับขั้นตอนใด ๆ ของการโยกย้ายหรือติดอยู่ตรงกลางเพียงแค่ไปที่ไฟล์การโยกย้ายและแสดงความคิดเห็นบรรทัดที่ถูกโยกย้ายแล้ว

หวังว่าจะช่วย


1
ผมเน้นคำแนะนำสำหรับคำสั่งคราด DB: . . เป็นการดีสำหรับภาพรวมเพื่อดูสถานะการดำเนินการปัจจุบันของไฟล์การโยกย้าย
ความงาม

1

หากคุณต้องการย้อนกลับและย้ายข้อมูลคุณสามารถเรียกใช้:

rake db:migrate:redo

นั่นเป็นเช่นเดียวกับ:

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