단일 마이그레이션 파일을 실행하십시오.


267

단일 마이그레이션을 실행하는 쉬운 방법이 있습니까? 특정 버전으로 마이그레이션하고 싶지 않고 특정 버전을 실행하고 싶습니다.


이것이 필요했기 때문에 마이그레이션으로 한 번 실행 한 것입니까? 그러면 여러 번 실행해야 할 유용한 쿼리가 될 수 있습니까? 아마도 마이그레이션 내용을 모델이나 다른 객체로 리팩터링 한 다음 마이그레이션이 해당 새 위치를 참조하도록해야합니다. 그런 다음 명령 줄에서 루비를 호출하여 레저에서 새 객체를 간단하게 실행할 수 있습니다.
Nathan Feger 2009

답변:


240

루비 파일에서 직접 코드를 실행할 수 있습니다.

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테이블이 업데이트되지 않지만 어쨌든 원하는 것처럼 보입니다.


59
때로는 요구 경로 앞에 './'가 필요하며 schema_migrations를 업데이트하지 않습니다.
Beardo

14
호출하기 전에 마이그레이션 개체의 인스턴스를 만들어야했습니다. 예AddFoos.new.up
Bentleyo

15
Rails 3.2를 요약하면 require "./db/migrate/db/migrate/20090408054532_add_foos.rb"다음과 같습니다.AddFoos.new.up
trisweb

50
마이그레이션 changeupand 대신에를 사용 하는 경우 다음 down을 실행해야합니다.AddFoos.new.migrate(:up)
Don Werve

6
4 번 레일에서 전화 할 수 있습니다AddFoos.new.change
lfender6445

429

최신 버전의 Rails를 가정하면 언제든지 다음을 실행할 수 있습니다.

rake db:migrate:up VERSION=20090408054532

여기서 version은 마이그레이션 파일 이름의 타임 스탬프입니다.

편집 : 지난 8 년 동안 어느 시점에서 (어떤 버전인지 확실하지 않습니다) Rails는 이미 실행 된 경우이를 실행하지 못하게하는 검사를 추가했습니다. 이것은 schema_migrations테이블 의 항목으로 표시됩니다 . 다시 실행하려면 간단히 실행하십시오 rake db:migrate:redo VERSION=20090408054532.


124
실제로 명령은 rake db : migrate : redo입니다. VERSION = my_version
Chirag Patel

2
@ Chirag Patel : 바로 내가 찾던 것입니다! 감사!
Abel

23
redo는 주어진 마이그레이션의 다운 메소드와 그 이후의 업 메소드를 실행합니다. up은 up-method 만 실행하며, 이것이 바로 묻는 사람이 원하는 것이라고 생각합니다.
Sven Koschnicke

7
데이터베이스 스키마 버전이 문제의 마이그레이션보다 늦은 경우 'up'이 실행되지 않는 것으로 보입니다 (예 : 다른 사람의 변경 사항을 병합 할 때 발생할 수 있음).
매트 코놀리

3
고마워, 나는 이것을 아래로 사용했다rake db:migrate:down VERSION=XXX
Nitrodist

107

특정 마이그레이션실행 하려면 다음을 수행하십시오.

$ 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그런 다음 upnuked 마이그레이션 방법 을 다시 실행합니다 .


"up"과 "redo"는 모두 효과가 없었지만 schema_migrations에서 행을 삭제하는 것이 완벽했습니다.
cesoid

27

다음 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)

1
이것은 또한 당신이 사용하는 경우에도 적용 up하고 down.
gak

17

이 마이그레이션 파일 "20150927161307_create_users.rb"를 다시 실행하는 단계입니다.

  1. 콘솔 모드를 실행하십시오. (레일 c)
  2. 해당 파일에있는 클래스를 복사하여 콘솔에 붙여 넣습니다.

    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
  3. 클래스의 인스턴스를 만듭니다 CreateUsers.c1 = CreateUsers.new

  4. change해당 인스턴스 의 메소드 를 실행하십시오 .c1.change

클래스와 함께 파일이 필요합니다 (예 : 콘솔 require "./db/migrate/20150927161307_create_users.rb"에서 복사 및 붙여 넣기 대신). 그런 다음 클래스에 정의 된 메소드를 인스턴스화하고 호출하여 클래스를 동일한 방식으로 실행할 수 있습니다 CreateUsers.new.change.
VinnyQ77

13

현재 rails 5당신은 또한 사용할 수 있습니다 rails대신rake

레일 3-4

# < rails-5.0
rake db:migrate:up VERSION=20160920130051

레일 5

# >= rails-5.0
rake db:migrate:up VERSION=20160920130051

# or

rails db:migrate:up VERSION=20160920130051

1
그것은 또한 당신이 필요로 추측rails db:migrate VERSION=20160920130051
frenesim

12

경로에 문제가있는 경우 사용할 수 있습니다

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'

6

방법 1 :

rake db:migrate:up VERSION=20080906120000

방법 2 :

Rails 콘솔에서 1. 콘솔에 마이그레이션 클래스를 붙여 넣기 (예 : add_name_to_user.rb) 2. 콘솔에 다음을 입력하십시오.

Sharding.run_on_all_shards{AddNameToUser.up}

끝났습니다 !!


5

대신 에 새로운 레일 환경 script/runner에서 사용해야 할 수도 있습니다 rails runner.


3

콘솔에서 실행하려면 다음을 찾으십시오.

$ 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로 엉망이되어 실행을 취소하고 빠른 솔루션으로 다시 가져와야합니다.


1

최소한 최신 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. 범위와 일치하는 모든 마이그레이션 파일이 실행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.