Làm thế nào để bạn quay trở lại di chuyển đường ray không thành công? Tôi hy vọng rằng rake db:rollback
sẽ hoàn tác việc di chuyển không thành công, nhưng không, nó sẽ cuộn lại lần di chuyển trước đó (di chuyển không thành công trừ đi một). Và rake db:migrate:down VERSION=myfailedmigration
cũng không hoạt động. Tôi đã chạy vào điều này một vài lần và nó rất bực bội. Dưới đây là một thử nghiệm đơn giản, tôi đã lặp lại trong các vấn đề:Quay lại di chuyển Rails không thành công
class SimpleTest < ActiveRecord::Migration
def self.up
add_column :assets, :test, :integer
# the following syntax error will cause the migration to fail
add_column :asset, :test2, :integer
end
def self.down
remove_column :assets, :test
remove_column :assets, :test2
end
end
kết quả:
== SimpleTest: migrating ===================================================== -- add_column(:assets, :test, :integer) -> 0.0932s -- add_column(:asset, :error) rake aborted! An error has occurred, all later migrations canceled: wrong number of arguments (2 for 3)
ok, cho phép cuộn nó lại:
$ rake db:rollback == AddLevelsToRoles: reverting =============================================== -- remove_column(:roles, :level) -> 0.0778s == AddLevelsToRoles: reverted (0.0779s) ======================================
huh? đó là lần di chuyển cuối cùng của tôi trước SimpleTest, không phải là di chuyển không thành công. (Và oh, nó sẽ được tốt đẹp nếu sản lượng di cư bao gồm số phiên bản.)
Vì vậy, cho phép thử chạy xuống cho SimpleTest di cư thất bại:
$ rake db:migrate:down VERSION=20090326173033 $
Không có gì xảy ra, và không có đầu ra một trong hai. Nhưng có lẽ nó chạy di chuyển không? Vì vậy, hãy khắc phục lỗi cú pháp trong quá trình di chuyển SimpleTest và thử chạy lại nó.
$ rake db:migrate:up VERSION=20090326173033 == SimpleTest: migrating ===================================================== -- add_column(:assets, :test, :integer) rake aborted! Mysql::Error: Duplicate column name 'test': ALTER TABLE `assets` ADD `test` int(11)
Không. Rõ ràng là di chuyển: không hoạt động. Nó không phải là thất bại, nó chỉ là không thực hiện.
Không có cách nào để loại bỏ bảng trùng lặp đó ngoài cách thủ công vào cơ sở dữ liệu và xóa nó, rồi chạy thử nghiệm. Phải có một cách tốt hơn thế.
Tuyệt vời, Cảm ơn. Tôi sẽ thực hiện các dự án mới với PGSQL để bạn biết đó là một lựa chọn tốt. –
Đây vẫn là câu trả lời hay nhất, vì vậy điều này xứng đáng với tiền thưởng. – nathanvda