Cách xóa tệp di chuyển trong Rails 3


109

Tôi muốn xóa / xóa một tệp di chuyển. Làm thế nào tôi sẽ làm điều đó? Tôi biết có những câu hỏi tương tự ở đây nhưng với tư cách là một bản cập nhật, có cách nào tốt hơn là thực hiện tập lệnh / hủy không?

Ngoài ra, tôi có nên thực hiện db:resethoặc db:dropnếu tôi xóa / xóa một lần di chuyển?

Câu trả lời:


142

Tôi thường:

  1. Thực hiện rake db:migrate VERSION=XXXtrên tất cả các môi trường, đến phiên bản trước môi trường tôi muốn xóa.
  2. Xóa tệp di chuyển theo cách thủ công.
  3. Nếu có quá trình di chuyển đang chờ xử lý (tức là lần di chuyển tôi đã xóa không phải là lần di chuyển cuối cùng), tôi chỉ cần thực hiện rake db:migratelại lần di chuyển mới .

Nếu ứng dụng của bạn đã được sản xuất hoặc dàn dựng, sẽ an toàn hơn nếu chỉ viết một quá trình di chuyển khác phá hủy bảng hoặc các cột của bạn.

Một tài liệu tham khảo tuyệt vời khác về di cư là: http://guides.rubyonrails.org/migrations.html


2
Việc xóa di chuyển và sau đó chạy db: migrate có xóa sạch bảng đã được tạo không?
alvincrespo

2
Không, vì Rails sẽ không biết cách xóa nó. Nó cần gọi self.downphương thức được xác định trong quá trình di chuyển của bạn để "hạ cấp" cơ sở dữ liệu của bạn.
Fábio Batista

35
Nếu bạn đã xóa tệp, mà không nhận ra đường ray sẽ không dễ dàng loại bỏ, rake db:migrate:statussẽ hiển thị cho bạn ID của tệp bị thiếu, bạn có thể sử dụng ID này để tạo lại nó. Sau khi nó trở lại, bạn có thể làm theo lời khuyên của câu trả lời này để chiến thắng.
Jordan Feldstein

1
@JordanFeldstein, cảm ơn bạn. db:migrate:statuslà một người tiết kiệm cuộc sống!
dee

1
@Lucas, một khi tệp di chuyển bị xóa, nó không thể được hoàn nguyên nữa. Đó là lý do tại sao bạn phải hoàn nguyên nó trên tất cả các môi trường mà nó đã chạy (sản xuất, phát triển, thử nghiệm, dàn dựng, v.v.) trước khi xóa tệp của nó. Đó cũng là lý do tại sao tôi đã viết rằng sẽ an toàn hơn nếu chỉ tạo một quá trình di chuyển khác để hoàn nguyên quá trình cũ đó, sau khi nó đã chạy trên sản xuất.
Fábio Batista

68

Một cách khác để xóa di chuyển:

$ rails d migration SameMigrationNameAsUsedToGenerate

Sử dụng nó trước khi rake db:migrateđược thực thi vì các thay đổi trong cơ sở dữ liệu sẽ tồn tại mãi mãi :) - hoặc xóa các thay đổi theo cách thủ công


3
"Nếu ứng dụng của bạn đã được sản xuất hoặc dàn dựng, sẽ an toàn hơn nếu chỉ viết một quá trình di chuyển khác phá hủy bảng hoặc các cột của bạn." Vì vậy, thay đổi này không ở lại trong cơ sở dữ liệu vĩnh viễn
JohnMerlino

8
Nhân tiện, "d" là viết tắt của "tiêu diệt".
Greg M. Krsak

21

Chạy các lệnh dưới đây từ thư mục chính của ứng dụng:

  1. rake db:migrate:down VERSION="20140311142212" (phiên bản ở đây là dấu thời gian được thêm vào trước bởi đường ray khi quá trình di chuyển được tạo. Hành động này sẽ hoàn nguyên các thay đổi của DB do quá trình di chuyển này)

  2. Run "rails destroy migration migration_name"(igration_name là cách sử dụng được chọn khi tạo quá trình di chuyển. Hãy xóa " timestamp_ " khỏi tên tệp di chuyển của bạn để lấy nó)


rake hủy di chuyển AddFileToTable rake bị hủy bỏ! Không biết làm thế nào để xây dựng nhiệm vụ 'hủy diệt' (Xem toàn bộ dấu vết bằng cách chạy nhiệm vụ với --trace)
sadaf2605

3
Đối với # 2 lệnh đúng là:rails d migration migration_name
mauriciomdea

1
Cảm ơn "remove timestamp_" gợi ý đó là những gì tôi cần
Lightman

10

Bạn cũng có thể chạy một quá trình di chuyển xuống như sau:

rake db:migrate:down VERSION=versionnumber

Tham khảo hướng dẫn Ruby on Rails về di chuyển để biết thêm thông tin.


9

Chúng ta có thể sử dụng,

$ rails d migration table_name  

Điều này sẽ xóa di chuyển.


1
Tôi nghĩ rằng nó phải được mô hình tên chứ không phải tên_bảng
Ajeet Khan

3

Đôi khi tôi thấy mình đang xóa tệp di chuyển và sau đó xóa mục nhập tương ứng trên bảng schema_migrations khỏi cơ sở dữ liệu. Không đẹp nhưng nó hoạt động.


3

Điều này cũng hoạt động trong Rails 5.

Nếu lần di chuyển là lần di chuyển gần đây nhất, bạn có thể xóa (các) cột cơ sở dữ liệu mà lần di chuyển đã thêm bằng cách thực hiện:

rake db:rollback

sau đó xóa chính tệp di chuyển bằng cách chạy:

rails d migration WhateverYourMigrationWasNamed.rb 


1

Không có câu trả lời nào trong số này hoàn toàn phù hợp với vấn đề tôi gặp phải vì quá trình di chuyển mà tôi muốn xóa bị thiếu: Tôi đã tạo và chạy một quá trình di chuyển trong một số nhánh khác, sau đó đã bị loại bỏ. Vấn đề là khi quá trình di chuyển được chạy, rails sẽ thêm phiên bản vào một schema_migrationsbảng trong cơ sở dữ liệu. Vì vậy, ngay cả khi nó không được liệt kê trong cấu trúc hoặc giản đồ db của bạn, rails vẫn tìm kiếm nó. Bạn có thể tiết lộ những cuộc di cư mồ côi này bằng cách chạy:

rails db:migrate:status

Lưu ý các phiên bản di chuyển bị thiếu và truy cập vào bảng điều khiển db:

rails dbconsole

Bây giờ, hãy xóa các phiên bản khỏi bảng di chuyển theo cách thủ công:

delete from schema_migrations where version='<version>';

Bây giờ bạn nên tốt.


0

Tôi vừa gặp vấn đề tương tự:

  1. rails d di chuyển fuu -điều này đã xóa di chuyển với dấu thời gian cuối cùng
  2. rails d di chuyển fuu-điều này đã xóa di chuyển khác
  3. sử dụng trạng thái git để kiểm tra xem nó không có trên các tệp chưa được theo dõi nữa
  4. đường ray g di chuyển fuu

Điều đó đã sửa nó cho tôi


0

Lưu ý bên: Bắt đầu từ rails 5.0.0 rakeđã được thay đổi thành rails Vì vậy, thực hiện như sau

rails db: di chuyển VERSION = 0

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.