Làm thế nào để quay trở lại một di chuyển cụ thể?


807

Tôi có tệp di chuyển sau db\migrate\20100905201547_create_blocks.rb

Làm cách nào tôi có thể khôi phục cụ thể tệp di chuyển đó?


1
Điều này có giải quyết được vấn đề không? Bạn sẽ chỉ cần thực hiện Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich

4
Mọi thông tin về di cư ở đây
Nishutosh Sharma

1
Bạn có muốn quay lại chỉ di chuyển cụ thể đó (ngay cả khi có các di chuyển mới hơn đi sau nó)? Hoặc bạn có muốn khôi phục lại cơ sở dữ liệu về trạng thái trước khi di chuyển đó và bất kỳ lần di chuyển tiếp theo nào được áp dụng không?
Jon Schneider

Câu trả lời:


1340
rake db:rollback STEP=1

Là một cách để làm điều này, nếu di chuyển bạn muốn quay lại là cách cuối cùng được áp dụng. Bạn có thể thay thế 1 cho nhiều lần di chuyển mà bạn muốn quay lại.

Ví dụ:

rake db:rollback STEP=5

Cũng sẽ khôi phục tất cả các di chuyển xảy ra sau đó (4, 3, 2 và 1).

Để khôi phục tất cả các lần di chuyển trở lại (và bao gồm) di chuyển mục tiêu, hãy sử dụng: (Lệnh đã sửa này đã được thêm SAU tất cả các ý kiến ​​chỉ ra lỗi trong bài viết gốc)

rake db:migrate VERSION=20100905201547

Để khôi phục CHỈ MỘT di chuyển cụ thể (NGOÀI ĐẶT HÀNG), hãy sử dụng:

rake db:migrate:down VERSION=20100905201547

Lưu ý rằng điều này sẽ KHÔNG quay trở lại bất kỳ di chuyển xen kẽ nào - chỉ một di chuyển được liệt kê. Nếu đó không phải là những gì bạn dự định, bạn có thể chạy một cách an toànrake db:migrate và nó sẽ chỉ chạy lại cái đó, bỏ qua bất kỳ cái nào khác mà trước đây không quay trở lại.

Và nếu bạn muốn di chuyển một thứ tự ra khỏi trật tự, thì cũng có nghịch đảo của nó db:migrate:up:

rake db:migrate:up VERSION=20100905201547

14
"Để quay lại phiên bản cụ thể" - không phải lệnh chỉ quay lại một lần di chuyển cụ thể, thay vì quay ngược lại phiên bản đó?
Andrew Grimm

10
"Để quay lại phiên bản cụ thể, hãy sử dụng ..." Câu trả lời này không chính xác! Điều này sẽ phục hồi việc di chuyển trong sự cô lập như được giải thích bởi các câu trả lời khác.
Rhys van der Waerden

3
CẢNH BÁO: Tôi đã mắc lỗi này: chỉ sử dụng rake db: di chuyển: xuống VERSION = 20100905201547 để quay lại trong ISOLATION !!! một tập tin di chuyển. Điều này được đề cập trong bình luận ở trên, nhưng tôi đã bỏ lỡ nó.
pixelearth

3
Một lời cảnh báo khác - đừng bao giờ làm STEP=-1. Tôi đã làm điều đó một lần và nó phát điên, đảo ngược mọi thứ. Không hay! Đây là Rails 4.2 - Tôi đoán bây giờ nó có thể được sửa.
Dave Hartnoll

1
Đã viết một bài viết trong blog của tôi về việc di chuyển, giải thích cách thức và thời điểm sử dụng các lệnh này: railsguides.net/polish-rails-migations
ka8725

867
rake db:migrate:down VERSION=20100905201547

sẽ khôi phục các tập tin cụ thể.


Để tìm phiên bản của tất cả các lần di chuyển, bạn có thể sử dụng lệnh này:

rake db:migrate:status

Hoặc, chỉ đơn giản là tiền tố của tên tệp di chuyển là phiên bản bạn cần quay lại.


Xem mục hướng dẫn Ruby on Rails về di chuyển.


48
Chắc chắn là câu trả lời ưa thích theo ý kiến ​​của tôi.
streetlogics

30
Điều đáng nói là nếu bạn quay lại một di chuyển cụ thể và không muốn nó di chuyển lại trên các tác vụ cào sắp tới, thì cũng sẽ xóa tệp di chuyển.
BradGreen

4
Lưu ý: có vẻ như nếu quá trình di chuyển lên không bao giờ thành công mà chỉ được thực hiện một phần thì việc xuống không làm gì cả.
cyrilchampier

1
@nerith, có lẽ chỉ đúng với cơ sở dữ liệu không hỗ trợ DDL giao dịch. MySQL không hỗ trợ DDL giao dịch: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreQuery hiện: wiki.postgresql.org/wiki/ , Vì vậy, việc di chuyển trên cơ sở dữ liệu MySQL của bạn bị hỏng sau đó bạn đã tự xóa một phần di chuyển thành công.
И Đăng nhập vào

1
Một quan sát khác liên quan đến bình luận @BradGreen. Nếu bạn muốn xóa tệp di chuyển và nó đã được triển khai, bạn sẽ muốn quay lại sản xuất / dàn dựng trước khi bạn cam kết mã với tệp đã xóa. Nếu không, bạn sẽ không thể rollback / di chuyển: xuống.
AdamT

57

Để quay lại di chuyển cuối cùng, bạn có thể làm:

rake db:rollback

Nếu bạn muốn quay lại di chuyển cụ thể với một phiên bản, bạn nên làm:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Ví dụ: nếu phiên bản là 20141201122027, bạn sẽ làm:

rake db:migrate:down VERSION=20141201122027

để quay trở lại di chuyển cụ thể.


32

Bạn có thể khôi phục di chuyển của mình bằng cách sử dụng rake db:rollback với các tùy chọn khác nhau. Cú pháp sẽ khác nhau theo yêu cầu của bạn.

Nếu bạn muốn quay lại chỉ di chuyển cuối cùng, thì bạn có thể sử dụng một trong hai

rake db:rollback

hoặc là

rake db:rollback STEP=1

Nếu bạn muốn số lần di chuyển quay lại cùng một lúc, thì bạn chỉ cần truyền một đối số:

rake db:rollback STEP=n

trong đó nsố lần di chuyển đến rollback, tính từ lần di chuyển mới nhất.

Nếu bạn muốn quay trở lại một di chuyển cụ thể, thì bạn nên chuyển phiên bản di chuyển sau:

rake db:migrate:down VERSION=xxxxx

trong đó xxxxx là số phiên bản của việc di chuyển.


1
thêm: xuống không hoạt động, câu trả lời đúng là không xuống
Elta3lab

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

Phiên bản là tiền tố số trên tên tệp di chuyển

Cách tìm phiên bản :

Các tập tin di chuyển của bạn được lưu trữ trong rails_root/db/migratethư mục của bạn . Tìm tệp thích hợp mà bạn muốn khôi phục và sao chép số tiền tố.

ví dụ

Tên tệp: 20140208031131_create_roles.rb sau đó là phiên bản20140208031131


6
Cách đơn giản nhất để tìm id di chuyển là chạyrake db:migrate:status
Aeradriel 14/03/2016

18

Quay trở lại di chuyển lần cuối:

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

Quay trở lại nsố lần di chuyển cuối cùng

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

Quay trở lại một di chuyển cụ thể

# 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

Để quay lại di chuyển cuối cùng, bạn có thể làm:

rake db:rollback

Nếu bạn muốn quay lại di chuyển cụ thể với một phiên bản, bạn nên làm:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Nếu tệp di chuyển mà bạn muốn khôi phục được gọi db/migrate/20141201122027_create_some_table.rb, thì VERSION cho di chuyển 20141201122027đó là dấu thời gian khi di chuyển đó được tạo và lệnh quay lại di chuyển đó sẽ là:

rake db:migrate:down VERSION=20141201122027

6

Nếu đó là một di chuyển đảo ngược và di chuyển cuối cùng đã được thực hiện, sau đó chạy rake db:rollback. Và bạn luôn có thể sử dụng phiên bản. ví dụ

tệp di chuyển là 20140716084539_create_customer_stats.rb, vì vậy lệnh rollback sẽ là, rake db:migrate:down VERSION=20140716084539


6

Để khôi phục tất cả các lần di chuyển lên đến một phiên bản cụ thể (ví dụ 20181002222222), hãy sử dụng:

rake db:migrate VERSION=20181002222222

(Lưu ý rằng điều này sử dụng db:migrate- không db:migrate:downnhư trong các câu trả lời khác cho câu hỏi này.)

Giả sử phiên bản di chuyển được chỉ định cũ hơn phiên bản hiện tại, điều này sẽ khôi phục tất cả các lần di chuyển lên đến, nhưng không bao gồm, phiên bản đã chỉ định.

Ví dụ: nếu rake db:migrate:statusban đầu hiển thị:

  (... 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

Đang chạy:

rake db:migrate VERSION=20181002222222

Sẽ cho kết quả:

  (... 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

Tham khảo: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migations


4

Từ Rails Guide

Hoàn nguyên các lần di chuyển trước

Bạn có thể sử dụng khả năng của Active Record để quay lại di chuyển bằng revertphương thức:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

Các revertphương pháp cũng chấp nhận một khối hướng dẫn để đảo ngược. Điều này có thể hữu ích để hoàn nguyên các phần được chọn của các lần di chuyển trước. Ví dụ: hãy tưởng tượng rằng CreatBlock được cam kết và sau đó quyết định tốt nhất là sử dụng xác thực Active Record, thay cho ràng buộc CHECK, để xác minh mã zip.

    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

Việc di chuyển tương tự cũng có thể được viết mà không sử dụng hoàn nguyên nhưng điều này sẽ bao gồm một số bước nữa: đảo ngược thứ tự của created_table và đảo ngược, thay thế created_table bằng drop_table, và cuối cùng thay thế bằng xuống và ngược lại. Đây là tất cả được chăm sóc bởi Revert.


3

Di chuyển thay đổi trạng thái của cơ sở dữ liệu bằng lệnh

$ bundle exec rake db:migrate

Chúng tôi có thể hoàn tác một bước di chuyển bằng cách sử dụng

  $ bundle exec rake db:rollback

Để quay trở lại từ đầu, chúng ta có thể sử dụng

  $ bundle exec rake db:migrate VERSION=0

Như bạn có thể đoán, thay thế bất kỳ số nào khác cho 0 di chuyển sang số phiên bản đó, trong đó số phiên bản đến từ việc liệt kê các lần di chuyển theo tuần tự


2

Vâng trong rails 5 nó khá dễ dàng rake db: di chuyển: trạng thái hoặc rails db: di chuyển: trạng thái

Nó đã được sửa đổi để xử lý cả hai cách giống nhau Sau đó, chỉ cần chọn Phiên bản nào bạn muốn quay lại và sau đó chạy rake db: di chuyển VERSION = 2013424230423

Đảm bảo VERSION là tất cả các chữ in hoa

Nếu bạn gặp vấn đề với bất kỳ bước di chuyển nào hoặc bị kẹt ở giữa, chỉ cần truy cập tệp di chuyển và nhận xét các dòng đã được di chuyển.

Mong rằng sẽ giúp


1
Tôi nhấn mạnh gợi ý cho lệnh rake db: Migrate: status . . . Thật tuyệt vời khi biết tổng quan để xem trạng thái thực thi hiện tại của các tệp di chuyển.
Làm đẹp

1

Nếu bạn muốn khôi phục và di chuyển, bạn có thể chạy:

rake db:migrate:redo

Điều đó giống như:

rake db:rollback
rake db:migrate
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.