2013-04-24 11 views

Trả lời

111

Trong khi phản hồi của @Orlandos là chính xác, rake db:reset không làm lại tất cả các lần di chuyển và, như ông nói, tải dữ liệu từ lược đồ cuối cùng. Nếu bạn muốn phục hồi lại tất cả các cuộc di cư và sau đó thực hiện lại chúng, bạn nên sử dụng:

rake db:migrate:reset #runs db:drop db:create db:migrate 

Bạn có thể xem thêm thông tin trong bài viết này: Difference between rake db:migrate db:reset and db:schema:load

+8

Câu trả lời đúng thực là –

+3

Câu trả lời này nên được chọn để tránh nhầm lẫn. –

+0

'rake db: migrate: reset' không thực sự khôi phục bất kỳ di chuyển nào, đó là câu hỏi thực sự hỏi. –

14

chỉ cần sử dụng rake db:reset, điều đó sẽ thả cơ sở dữ liệu của bạn (giống như hoàn tác tất cả di chuyển) và đặt lại thành giản đồ cuối cùng.

CẬP NHẬT: cách tiếp cận chính xác hơn sẽ sử dụng rake db:migrate:reset. Điều đó sẽ thả cơ sở dữ liệu, tạo lại nó và chạy tất cả các di chuyển, thay vì đặt lại lược đồ mới nhất.

+8

Đây không phải là câu hỏi muốn làm. Nếu bạn thay đổi điều gì đó trong quá trình di chuyển, nó sẽ không cập nhật các thay đổi trong lược đồ. –

+0

@Alex Falke có câu trả lời đúng cho câu hỏi này. – Qasim

+0

@ Câu trả lời bắt đầu cập nhật :) – Orlando

16

Nếu bạn thực sự muốn rollback tất cả nhân công nhập cư, và không chỉ lấy cơ sở dữ liệu về trạng thái nguyên sơ hoặc lược đồ cuối cùng, bạn phải chạy:

rake db:migrate VERSION=0 

Điều này thực sự sẽ rollback tất cả các con đường xuống mỗi di cư và ensu rằng mọi di chuyển đều có thể đảo ngược.

Nếu bây giờ bạn phát hành

rake db:migrate:status 

bạn sẽ thấy rằng tất cả các cuộc di cư vẫn còn ở đó nhưng họ đang ở trong một 'xuống' (không áp dụng) nhà nước.

Các lệnh khác ngụ ý rake db:reset hoặc rake db:drop (chẳng hạn như trong câu trả lời của @Orlando hoặc @Alex Falke) sẽ không thực hiện bất kỳ khôi phục nào: nghĩa là chúng sẽ không đảm bảo rằng mọi di chuyển đều có thể đảo ngược.

Hơn nữa, rake db:drop không thể chạy trong khi cơ sở dữ liệu đang được truy cập bởi người dùng khác, trong khi rollback có thể được thực hiện trực tiếp (ngay cả khi điều này thường không được khuyến nghị). Và cuối cùng nhưng không kém phần quan trọng, chỉ cần thả và tạo lại cơ sở dữ liệu cũng sẽ xóa bảng di chuyển lược đồ: nếu ai đó chạy rake db:migrate:status sau khi cơ sở dữ liệu bị xóa, anh ta sẽ được trả lời với "Bảng di chuyển giản đồ chưa tồn tại" và sẽ không có manh mối về việc di chuyển nào có thể được áp dụng (trừ khi anh ta biết nó hoặc có thể liệt kê chúng).