Câu trả lời:
rake db:migrate:redo VERSION=xxxxxxx
, nhưng điều đó sẽ chạy down
và sau đó là up
bước. Bạn có thể làm điều này kết hợp với bình luận tạm thời ra bước xuống.
rake -T
.
db:test:prepare
cũng không hiển thị trong danh sách đó. Chúa ơi, tôi đến trễ bữa tiệc.
rake db:migrate:up VERSION=my_version
có thể không làm gì cả , bởi vì bảng schema_migrations vẫn cho biết nó đã được chạy. Trong tình huống tương tự rake db:migrate:redo VERSION=my_version
có thể thất bại vì nó không thể làm rơi bàn. Trong trường hợp này, hãy bình luận về down
phương pháp trong quá trình di chuyển tạm thời và chạy lạirake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
tương tự rake db:migrate:down
để giảm một quá trình di chuyển cụ thể. Bạn có thể nhận được danh sách các nhiệm vụ cào có sẵn với rake -T
.
VERSION
được đề cập ở đây là giá trị số nguyên ở đầu mỗi tệp di chuyển của bạn (chỉ là dấu thời gian của thời điểm nó được tạo). Ví dụ VERSION=20150720023630
,.
VERSION
chỉ là một biến môi trường nên nó có thể xuất hiện đầu tiên trong lệnh hoặc thậm chí đặt trước lệnh:VERSION=1234567890 rake db:migrate:up
Tôi đã phải chạy một lần di chuyển duy nhất đã thay đổi và cần được chạy lại một cách độc lập với tất cả các lần di chuyển khác. Khởi động bảng điều khiển và làm điều này:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
Hữu ích hơn, điều này có thể được đưa vào một nhiệm vụ cào, v.v.
change
, hãy chạy YourMigrations.migrate(:up)
thay thế (hoặc :down
quá!)
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
hãy thử xem.
VERSION
chỉ là một biến môi trường nên nó có thể xuất hiện đầu tiên trong lệnh hoặc thậm chí đặt trước lệnh:VERSION=20098252345 rake db:migrate
rake db:migrate:redo version='xxxx'
Hãy nhớ đặt dấu ngoặc kép xung quanh xxxx, xxxx là dấu thời gian (hoặc ID di chuyển) cho quá trình di chuyển của bạn.
Bạn có thể kiểm tra dấu thời gian (ID di chuyển) cho các lần di chuyển trước mà bạn đã thực hiện bằng cách sử dụng
rake db:migrate:status
Mở rộng câu trả lời của korch ở trên, require
không hiệu quả với tôi, nhưng load
đã làm. Cụ thể, đối với tệp di chuyển:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
trong bảng điều khiển gõ
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
đã làm cho tôi.
> Race.new.min_quantity # => 0
Điều này dành cho ruby 1.9.3p484 (2013-11-22 sửa đổi 43786) [x86_64-linux] và Rails 3.2.13.
Thêm 2 ¢ của tôi vào điều này vì tôi đã gặp phải vấn đề tương tự:
Nếu bạn hoàn toàn muốn chạy lại quá trình di chuyển mà không cần tạo di chuyển mới, bạn có thể làm như sau:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
Và rails sẽ "quên" rằng nó đã chạy quá trình di chuyển cho 20150105181157. Bây giờ khi bạn chạy db: migrate, nó sẽ chạy lại.
Mặc dù vậy, điều này hầu như luôn luôn là một ý tưởng tồi. Một ví dụ duy nhất mà nó có thể có ý nghĩa là nếu bạn có một nhánh phát triển và bạn vẫn chưa hoàn thiện quá trình di chuyển của mình và muốn thêm một số thứ vào nó trong quá trình phát triển. Nhưng ngay cả khi đó, tốt hơn là bạn nên thực hiện quá trình di chuyển của mình theo 2 chiều để bạn có thể khôi phục đúng cách và thử lại nhiều lần.
Phải có một cách để chạy lớp di chuyển thông qua bảng điều khiển. Tôi dường như không thể nhận ra mã di chuyển.
Tuy nhiên, như các nhận xét cho thấy, bạn nên chạy quá trình di chuyển theo thứ tự. Sử dụng:
rake db:migrate VERSION=##########
Sao chép và dán mã của bạn trong quá trình di chuyển sang tập lệnh / bảng điều khiển?
Tôi có một phương pháp tiện ích giúp việc phát triển rất dễ dàng. Tôi thấy rằng nó giúp tôi tránh tạo ra quá nhiều lần di chuyển - thông thường tôi sẽ sửa đổi các lần di chuyển cho đến khi chúng được triển khai.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
Tôi sử dụng kỹ thuật này trong quá trình phát triển khi tôi thay đổi một lượng lớn quá trình di chuyển và tôi không muốn di chuyển quá nhiều và mất bất kỳ dữ liệu nào trong quá trình đó (đặc biệt là khi tôi đang nhập dữ liệu kế thừa mất nhiều thời gian Tôi không muốn phải nhập lại lần nữa).
Đây là 100% hackish và tôi chắc chắn không khuyên bạn nên làm điều này trong sản xuất, nhưng nó sẽ thực hiện được mẹo:
STEP=n
tham số đểdb:migrate
(nơin
là số di cư để chạy, giống như có chodb:rollback
) - sau đó bạn có thể làmrake db:migrate STEP=1
hoặcrake db:migrate STEP=2
vv