Có một cách dễ dàng để chạy một di chuyển? Tôi không muốn chuyển sang một phiên bản nhất định Tôi chỉ muốn chạy một phiên bản cụ thể.
Có một cách dễ dàng để chạy một di chuyển? Tôi không muốn chuyển sang một phiên bản nhất định Tôi chỉ muốn chạy một phiên bản cụ thể.
Câu trả lời:
Bạn chỉ có thể chạy mã trực tiếp từ tệp ruby:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Lưu ý: phiên bản mới hơn của đường ray có thể yêu cầu AddFoos.new.up
hơn là AddFoos.up
.
Một cách khác (không có IRB) dựa trên thực tế yêu cầu trả về một mảng các tên lớp:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Lưu ý rằng nếu bạn làm điều này, nó có thể sẽ không cập nhật schema_migrations
bảng, nhưng có vẻ như đó là những gì bạn muốn.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
sau đóAddFoos.new.up
change
thay vì up
và down
, bạn sẽ cần phải chạyAddFoos.new.migrate(:up)
AddFoos.new.change
Giả sử phiên bản Rails khá gần đây bạn luôn có thể chạy:
rake db:migrate:up VERSION=20090408054532
Trong đó phiên bản là dấu thời gian trong tên tệp của di chuyển.
Chỉnh sửa: Tại một số thời điểm trong 8 năm qua (Tôi không chắc là phiên bản nào) Rails đã thêm các kiểm tra ngăn việc này chạy nếu nó đã được chạy. Điều này được chỉ định bởi một mục trong schema_migrations
bảng. Để chạy lại nó, chỉ cần thực hiện rake db:migrate:redo VERSION=20090408054532
thay thế.
rake db:migrate:down VERSION=XXX
Nếu bạn muốn chạy một di chuyển cụ thể , hãy làm
$ rake db:migrate:up VERSION=20080906120000
Nếu bạn muốn chạy di chuyển nhiều lần , hãy làm
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Nếu bạn muốn chạy một lần di chuyển nhiều lần, hãy làm
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(bạn có thể tìm thấy số phiên bản trong tên tệp di chuyển của mình)
Chỉnh sửa: Bạn cũng có thể chỉ cần đổi tên tệp di chuyển của mình, vd:
20151013131830_my_migration.rb
-> 20151013131831_my_migration.rb
Sau đó di chuyển bình thường, điều này sẽ coi việc di chuyển là một di chuyển mới (hữu ích nếu bạn muốn di chuyển trên một môi trường từ xa (chẳng hạn như dàn dựng) mà bạn có ít quyền kiểm soát hơn.
Chỉnh sửa 2 : Bạn cũng có thể chỉ cần nhập mục di chuyển trong cơ sở dữ liệu. Ví dụ:
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migrate
sau đó sẽ chạy lại up
phương thức di chuyển của nuked.
Nếu bạn đã thực hiện một change
phương pháp như thế này:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
Bạn có thể tạo một phiên bản di chuyển và chạy migrate(:up)
hoặc migrate(:down)
trên một cá thể, như thế này:
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
up
và down
.
Đây là các bước để chạy lại tệp di chuyển này "20150927161307_create_users.rb"
Sao chép và qua lớp trong tệp đó vào bàn điều khiển.
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps null: false end
end
end
end
Tạo một thể hiện của lớp CreateUsers
:c1 = CreateUsers.new
change
của trường hợp đó:c1.change
require "./db/migrate/20150927161307_create_users.rb"
thay vì sao chép và dán. Sau đó, bạn có thể chạy lớp theo cùng một cách bằng cách khởi tạo và gọi phương thức được định nghĩa trong lớp CreateUsers.new.change
.
Như rails 5
bạn cũng có thể sử dụng rails
thay vìrake
Đường ray 3 - 4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Đường ray 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
rails db:migrate VERSION=20160920130051
Nếu bạn gặp sự cố với đường dẫn, bạn có thể sử dụng
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Xin lưu ý rằng thay vì script/runner
, bạn có thể phải sử dụng rails runner
trên các môi trường đường ray mới.
Nếu bạn muốn chạy nó từ bảng điều khiển, đây là những gì bạn đang tìm kiếm:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
Tôi đã thử các câu trả lời khác, nhưng yêu cầu mà không Rails.root
làm việc cho tôi.
Cũng thế, .migrate(:up)
một phần buộc di chuyển để chạy lại bất kể nó đã chạy hay chưa. Điều này hữu ích khi bạn đã chạy di chuyển, loại bỏ nó bằng cách làm rối tung db và muốn một giải pháp nhanh chóng để thực hiện lại.
Có vẻ như ít nhất là trong bản phát hành Rails mới nhất (5.2 tại thời điểm viết bài), có một cách nữa để lọc các di chuyển đang được chạy. Người ta có thể vượt qua một bộ lọc trong mộtSCOPE
biến môi trường mà sau đó sẽ được sử dụng để chọn các tệp di chuyển.
Giả sử bạn có hai tệp di chuyển 1_add_foos.rb
và 2_add_foos.run_this_one.rb
đang chạy
SCOPE=run_this_one rails db:migrate:up
sẽ chọn và chỉ chạy 2_add_foos.run_this_one.rb
. Hãy nhớ rằng tất cả các tệp di chuyển phù hợp với phạm vi sẽ được chạy.