2012-07-03 29 views
36

Tôi đang viết ứng dụng Rails đầu tiên của mình. Tôi đã chạy một vài lệnh rails generate model ...rake db:migrate, nhưng bây giờ tôi muốn thay đổi mô hình dữ liệu của mình và vì vậy cần phải hoàn tác một vài lần di chuyển.rake db: rollback không hoạt động?

docs nói rằng tôi có thể hoàn tác di chuyển với rake db:rollback, nhưng điều này không hoạt động. Khi tôi chạy điều này trong bảng điều khiển, máy tính nghĩ trong vài giây nhưng không thực hiện bất kỳ thay đổi nào đối với db/migrate/ hoặc db/migrate/schema.rb. Không có đầu ra nào được in ra bàn điều khiển.

Hành vi này có đúng không? Không nên db:rollback đang thay đổi giản đồ của tôi? Nếu vậy, bất cứ ai có thể nghĩ tại sao nó có thể không hoạt động?

Tôi đang ở trên Rails phiên bản 3.2.6.

EDIT

Tại thời điểm rake db:migrate:status cho

database: db/development.sqlite3 

Status Migration ID Migration Name 
-------------------------------------------------- 
    up  20120617191211 Create irs 
    up  20120701154357 Create paths 
    up  20120701154421 Create nodes 
    up  20120702151447 ********** NO FILE ********** 
    down 20120702155140 Create venues 
    down 20120703233833 Remove path from venues 
+2

Có thể cung cấp cho chúng tôi đầu ra của 'rake db: migrate: status'. – Peter

+0

ok, xong. NO FILE có vẻ đáng ngại ... là một phần của vấn đề? –

+3

Có. 'db: rollback' chạy phương thức xuống trong lần di chuyển được áp dụng mới nhất, trong trường hợp này dường như là một trong những nơi tệp bị thiếu. –

Trả lời

59

Solution (xem nhận xét của tôi): chạy

rake db:migrate:status 

và các vấn đề chính xác bạn tìm thấy ở đó. Trong trường hợp này (theo dõi @MarkThomas '), bạn có thể muốn kiểm tra tất cả các tệp bạn cần có tại chỗ.

+11

Cảm ơn, điều này đã làm việc. Kỳ lạ thay, mặc dù, tôi đã không bao giờ có thể tìm thấy một tập tin với ID di cư mà đường ray đã được tìm kiếm (20120702151447). Cuối cùng tôi đã tạo một tệp "giả" với tên '20120702151447_create_nothing.rb' và body' class CreateNothing

+8

Tôi đã có một số tệp di chuyển bị thiếu do xóa một gem theo cách thủ công. Thay vì tạo tệp giả, tôi đã xóa các bản ghi từ bảng 'schema_migrations', như:' delete from schema_migrations nơi phiên bản trong ('20150424220749', '20150424220748'); 'Điều đó đã sửa nó cho tôi. – Derek

+0

@Derek phải là câu trả lời –

3

Nếu

rake db:migrate:status 

mang đến cho bạn một sự chuyển đổi mà nói

up 20120702151447 ********** NO FILE **********

Sau đó, điều tốt nhất để làm sẽ là để làm một (lưu ý rằng các lệnh sau đây sẽ thả các cơ sở dữ liệu):

rake db:reset 

để làm lại tất cả di chuyển. Nếu di chuyển gần nhất là một mất tích, sau đó schema.rb sẽ phải di chuyển gần nhất mà rake db:migrate sẽ tìm kiếm:

ActiveRecord::Schema.define(:version => 20120702151447) do

Thay đổi con số để người cuối cùng trong thư mục di cư của bạn.

+0

Nếu bạn có người dùng & xác thực, hãy đảm bảo bạn thực hiện các điều khoản không tự khóa mình. Ví dụ: thêm người dùng của bạn trong db/seed.rb. – iconoclast

+2

Fwiw, khi tôi gặp phải vấn đề này là vì tôi đã di chuyển và sau đó, cần phải sửa lỗi nhanh trước khi tiếp tục làm việc với tính năng liên quan đến di chuyển, 'git stash'-ed thay đổi cục bộ của tôi mà không cần quay lại đầu tiên . Với ý nghĩ đó, cách tiếp cận tốt nhất có thể là để unstash đầu tiên, rollback, và sau đó stash một lần nữa. – clozach

+9

!! Hãy nhớ rằng rake db: reset sẽ thả cơ sở dữ liệu hiện tại của bạn và bạn sẽ mất tất cả dữ liệu của bạn. Hãy chắc chắn đó là những gì bạn muốn làm. – user1515295

1

Đây là những gì phù hợp với tôi. Kết hợp các bước được đưa ra trong this answer và nhận xét theo dB.

  1. chạy rake db: di chuyển: tình trạng
  2. Nếu bạn có một **** KHÔNG entry FILE ****, chỉ cần lưu ý số phiên bản như noFileVersion. Lưu ý phiên bản của mục nhập ngay trên không có mục nhập tệp (stable_version).
  3. tạo ra một "giả" tập tin với tên noFileVersion_create_nothing.rb, và cơ thể class CreateNothing < ActiveRecord::Migration def change end end
  4. chạy rake db: migrate VERSION = stable_version
  5. tháo noFileVersion_create_nothing.rb bằng tay.
  6. chạy rake db: di chuyển.
  7. chạy rake db: di chuyển: trạng thái lần nữa để kiểm tra xem không có mục nhập tệp nào đã biến mất.
Các vấn đề liên quan