Làm thế nào để bạn khôi phục lại một lần di chuyển đường ray bị lỗi? Tôi mong đợi điều đó rake db:rollback
sẽ hoàn tác quá trình di chuyển không thành công, nhưng không, nó sẽ quay trở lại lần di chuyển trước đó (lần 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 đã gặp phải điều này một vài lần và nó rất bực bội. Đây là một thử nghiệm đơn giản mà tôi đã thực hiện để khắc phục sự cố:
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: di chuyển ============================================= ======== - add_column (: asset,: test,: integer) -> 0,0932 giây - add_column (: asset,: error) cào bị hủy bỏ! Đã xảy ra lỗi, tất cả các lần di chuyển sau này đều bị hủy: sai số đối số (2 cho 3)
được rồi, hãy khôi phục lại:
$ rake db: rollback == AddLevelsToRoles: hoàn nguyên ============================================= == - remove_column (: role,: level) -> 0,0778 giây == AddLevelsToRoles: hoàn nguyên (0,0779 giây) ======================================
Huh? đó là lần di chuyển cuối cùng của tôi trước SimpleTest, không phải lần di chuyển thất bại. (Và ồ, sẽ thật tuyệt nếu đầu ra di chuyển bao gồm số phiên bản.)
Vì vậy, hãy thử chạy xuống SimpleTest di chuyển không thành công:
$ rake db: migrate: down VERSION = 20090326173033 $
Không có gì xảy ra, và cũng không có đầu ra. Nhưng có lẽ nó đã chạy quá trình di chuyển? Vì vậy, hãy sửa lỗi cú pháp trong quá trình di chuyển SimpleTest và thử chạy lại.
$ rake db: migrate: up VERSION = 20090326173033 == SimpleTest: di chuyển ============================================= ======== - add_column (: asset,: test,: integer) cào bị hủy bỏ! Mysql :: Lỗi: Tên cột trùng lặp 'test': ALTER TABLE `asset` ADD` test` int (11)
Không. Rõ ràng là di chuyển: xuống không hoạt động. Nó không thất bại, nó chỉ là không thực thi.
Không có cách nào để loại bỏ bảng trùng lặp đó ngoài việc truy cập thủ công vào cơ sở dữ liệu và xóa nó, sau đó chạy thử nghiệm. Phải có một cách tốt hơn thế.