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 đó?
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 đó?
Câu trả lời:
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
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.
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.
Để 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ể.
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 đó n
số 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.
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/migrate
thư 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
rake db:migrate:status
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 n
số 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
Để 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
Để 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:down
như 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:status
ban đầ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
Từ Rails Guide
Bạn có thể sử dụng khả năng của Active Record để quay lại di chuyển bằng revert
phươ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 revert
phươ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.
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ự
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
Class.down
stackoverflow.com/questions/753919/run-a-single-migration-file