2015-08-05 17 views
12

Tôi hiện đang theo dõi hướng dẫn về đường ray trên ruby: http://guides.rubyonrails.org/getting_started.html.Đường ray: Cách xóa di chuyển đang chờ xử lý

Tôi đang cố lưu dữ liệu vào cơ sở dữ liệu. Tuy nhiên, khi tôi chạy: rails server tôi nhận được lỗi sau:

Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development 

Tôi đã nhìn vào các bài viết khác và khi tôi chạy:

bin/rake db:migrate 

tôi nhận được một rake aborted!

Sau khi chạy :

rake db:abort_if_pending_migrations.... 

Tôi thấy rằng:

You have 1 pending migration: 
20150805200129 CreateDatabases 

SQLite3::SQLException: table "databases" already exists: 

và nó chỉ bảo tôi chạy db rake: di chuyển để bắt đầu lại.

có vẻ như nó đã tồn tại, có cách nào để hủy quá trình di chuyển đang chờ xử lý không?

+0

di cư cấp phát của bạn đang cố gắng để tạo ra 'databases' bảng, vốn đã tồn tại ... –

Trả lời

6

Bạn có thể di chuyển không thành công ở giữa chừng (vì vậy nó đã tạo bảng nhưng không kết thúc).

Bạn chỉ cần sử dụng môi trường phát triển, do đó, nó không quan trọng để chỉ cần thả cơ sở dữ liệu và xây dựng lại nó từ đầu:

rake db:drop 
rake db:create 
rake db:migrate 
+4

Tôi nghĩ rằng đó là nguy hiểm để giả định rằng nó là okay để thả một db phát triển. Tôi đã thấy dbs phát triển mất khá nhiều thời gian để khôi phục. – spickermann

+0

những gì đã rất khó khăn về việc khôi phục nó? tốt, bạn có thể sử dụng 'rake db: schema: load' thay vì' db: migrate' nếu bạn có một số di chuyển kế thừa không còn hoạt động nữa – EugZol

+0

Điều đó đã hiệu quả! Cảm ơn sự thấu hiểu! Và @spickermann bạn nói đúng, may mắn thay nó có thể được thay thế chỉ trong vài giây như những thứ cấp nhập cảnh của nó. –

9

Đôi khi, thậm chí thả một cơ sở dữ liệu phát triển địa phương không phải là một ý tưởng tốt. Có nhiều cách tốt hơn để xóa/phá hủy một di chuyển cụ thể trong ứng dụng Rails của bạn.

Bạn có thể sử dụng rails d migration lệnh để tiêu diệt một di cư đặc biệt:

rails d migration MigrationName 

Để hoàn tác các thay đổi tương ứng với một sự chuyển đổi cụ thể, bạn có thể sử dụng db:migrate:down phương pháp như thế này:

rake db:migrate:down VERSION=XXX 

Đôi khi, mọi thứ có thể trở nên lộn xộn hơn và trong tình huống đó, một điều tiện lợi khác là xem bảng schema_migrations trong cơ sở dữ liệu của bạn có tất cả các di chuyển với version được lưu trong nó.

Bạn có thể xóa một sự chuyển đổi cụ thể từ bảng này như thế này:

delete from schema_migrations WHERE version = VERSION; 

nếu bạn không muốn di cư mà có mặt nữa.

+0

Đáng nói rằng vấn đề này có thể được tránh hoàn toàn bằng cách sử dụng RDBMS thích hợp với các giao dịch DDL, như Postgres. – EugZol

-1

Nếu bạn muốn phục hồi các di cư sai, Bạn có thể thả toàn bộ db sử dụng này:

rake db:drop 

Sau đó, loại bỏ các cuộc di cư tập tin bằng tay (Điều này sẽ không làm hỏng các db khi bạn tạo lại như di cư Schema sẽ cũng giảm xuống).

Sau đó chạy

rake db:migrate 

Và nếu có dữ liệu được hạt giống, sau đó chạy này cũng

rake db:setup 
+0

Cảm ơn bạn đã nhập! –

1

Nếu bạn đang như tôi và duy trì cấu trúc cơ sở dữ liệu của bạn bên ngoài của Rails, bạn có thể chỉ cần xóa tệp di chuyển khỏi db/migration. Tôi đã nhận được lỗi trong câu hỏi của OP khi tôi sử dụng các rails tạo ra lệnh để tạo ra một lớp mô hình, quên rằng nó cũng tạo ra một tập tin di chuyển.

Không sử dụng phương pháp này nếu bạn dựa vào Rails để duy trì cấu trúc cơ sở dữ liệu của mình!

tôi tiếp tục nộp cấu trúc Rails của tôi đến nay bằng cách xây dựng nó từ cơ sở dữ liệu sử dụng:

bundle exec rake db:structure:dump 
+0

Thông tin chi tiết tuyệt vời, cảm ơn bạn! –

Các vấn đề liên quan