답변:
루비 파일에서 직접 코드를 실행할 수 있습니다.
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
참고 : 최신 버전의 레일 AddFoos.new.up
대신이 필요할 수 있습니다 AddFoos.up
.
IRB가없는 다른 방법은 클래스 이름 배열을 반환해야한다는 사실에 의존합니다.
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
이 작업을 수행하면 schema_migrations
테이블이 업데이트되지 않지만 어쨌든 원하는 것처럼 보입니다.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
다음과 같습니다.AddFoos.new.up
change
이 up
and 대신에를 사용 하는 경우 다음 down
을 실행해야합니다.AddFoos.new.migrate(:up)
AddFoos.new.change
최신 버전의 Rails를 가정하면 언제든지 다음을 실행할 수 있습니다.
rake db:migrate:up VERSION=20090408054532
여기서 version은 마이그레이션 파일 이름의 타임 스탬프입니다.
편집 : 지난 8 년 동안 어느 시점에서 (어떤 버전인지 확실하지 않습니다) Rails는 이미 실행 된 경우이를 실행하지 못하게하는 검사를 추가했습니다. 이것은 schema_migrations
테이블 의 항목으로 표시됩니다 . 다시 실행하려면 간단히 실행하십시오 rake db:migrate:redo VERSION=20090408054532
.
rake db:migrate:down VERSION=XXX
특정 마이그레이션 을 실행 하려면 다음을 수행하십시오.
$ rake db:migrate:up VERSION=20080906120000
마이그레이션을 여러 번 실행하려면 다음을 수행하십시오.
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
단일 마이그레이션을 여러 번 실행하려면 다음을 수행하십시오.
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(이주 파일 이름에서 버전 번호를 찾을 수 있습니다)
편집 : 마이그레이션 파일의 이름을 간단히 바꿀 수도 있습니다 (예 :
20151013131830_my_migration.rb
-> 20151013131831_my_migration.rb
그런 다음 정상적으로 마이그레이션하면 마이그레이션이 새로운 마이그레이션으로 처리됩니다 (스테이징과 같은 원격 환경에서 마이그레이션하려는 경우 유용).
편집 2 : 데이터베이스에서 마이그레이션 항목을 정리할 수도 있습니다. 예 :
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migrate
그런 다음 up
nuked 마이그레이션 방법 을 다시 실행합니다 .
다음 change
과 같은 방법을 구현 한 경우 :
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
다음과 같이 마이그레이션 인스턴스를 작성하고 인스턴스에서 migrate(:up)
또는 migrate(:down)
인스턴스에서 실행할 수 있습니다 .
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
up
하고 down
.
이 마이그레이션 파일 "20150927161307_create_users.rb"를 다시 실행하는 단계입니다.
해당 파일에있는 클래스를 복사하여 콘솔에 붙여 넣습니다.
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
클래스의 인스턴스를 만듭니다 CreateUsers
.c1 = CreateUsers.new
change
해당 인스턴스 의 메소드 를 실행하십시오 .c1.change
require "./db/migrate/20150927161307_create_users.rb"
에서 복사 및 붙여 넣기 대신). 그런 다음 클래스에 정의 된 메소드를 인스턴스화하고 호출하여 클래스를 동일한 방식으로 실행할 수 있습니다 CreateUsers.new.change
.
경로에 문제가있는 경우 사용할 수 있습니다
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
콘솔에서 실행하려면 다음을 찾으십시오.
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
나는 다른 답변을 시도했지만 Rails.root
나에게 도움 이되지 않고 요구했다 .
또한 .migrate(:up)
part는 마이그레이션이 이미 실행되었는지 여부에 관계없이 마이그레이션을 강제로 다시 실행합니다. 이 기능은 이미 마이그레이션을 실행했을 때 유용하며 db로 엉망이되어 실행을 취소하고 빠른 솔루션으로 다시 가져와야합니다.
최소한 최신 Rails 릴리스 (작성 당시 5.2)에는 실행중인 마이그레이션을 필터링하는 또 다른 방법이 있습니다. SCOPE
환경 변수에 필터를 전달하면 마이그레이션 파일을 선택하는 데 사용됩니다.
두 개의 마이그레이션 파일이 있다고 가정 1_add_foos.rb
하고2_add_foos.run_this_one.rb
실행 중이라고
SCOPE=run_this_one rails db:migrate:up
선택하고 실행합니다 2_add_foos.run_this_one.rb
. 범위와 일치하는 모든 마이그레이션 파일이 실행됩니다.