한 번만 마이그레이션


94

내 레일 앱에서 전체 무리 중 하나의 마이그레이션 만 실행하려고합니다. 어떻게 할 수 있습니까? 이전 또는 이후에 마이그레이션을 실행하고 싶지 않습니다. 감사.


1
이 편리한 레일 기능 것이다하십시오 추가 STEP=n로 인수를 db:migrate(여기서 n실행하려면 마이그레이션의 수가있다처럼입니다 db:rollback) - 당신이 할 수있는 rake db:migrate STEP=1또는 rake db:migrate STEP=2
user664833

답변:


164

rake db:migrate:redo VERSION=xxxxxxx,하지만 down그러면 up단계 가 실행됩니다 . 일시적으로 다운 단계를 주석 처리하는 것과 함께이 작업을 수행 할 수 있습니다.


흠, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo는 VERSION 인수를 사용하지 않는 것 같습니다.
Terry G Lorber

3
@pedrorolo : 이것은 구식이 아닙니다. 이 작업에는 설명이 없으므로에 표시되지 않습니다 rake -T.
Ryan Bigg 2011 년

1
@pedrorolo : db:test:prepare또한 해당 목록에 표시되지 않습니다. 파티에 늦었 어.
mraaroncruz 2011

9
Ryan이 말한 내용을 확장하기 위해 테이블이 Rails 외부의 데이터베이스에서 삭제 된 경우 schema_migrations 테이블이 여전히 실행되었다고 표시하므로 아무rake db:migrate:up VERSION=my_version 작업 수행하지 않을 수 있습니다. 같은 상황에서 rake db:migrate:redo VERSION=my_version실패 는 테이블을 삭제할 수 없습니다 때문입니다. 이 경우 down마이그레이션 방법을 임시로 주석 처리 하고 다시 실행하십시오rake db:migrate:redo...
Leo

3
그리고 @Leo가 말하는 것을 확장하려면 마이그레이션이 def change로 정의 된 경우 위와 함께 def self.up으로 변경하십시오.
valk

70
rake db:migrate:up VERSION=1234567890

유사하게 rake db:migrate:down특정 마이그레이션을 중단합니다. 사용 가능한 레이크 작업 목록은 rake -T.


4
VERSION여기에 언급 (가 작성되었을 때의 바로 타임 스탬프입니다) 마이그레이션 각 파일의 시작 부분에 정수 값입니다. 예 : VERSION=20150720023630.
aaron-coding

3
버전은 rake db : migrate : status와 함께 멋지게 표시됩니다.
jpgeek

주목할만한 VERSION것은 환경 변수 일 뿐이므로 명령에서 먼저 오거나 명령 이전에 설정할 수도 있습니다.VERSION=1234567890 rake db:migrate:up
Joshua Pinter

25

변경된 단일 마이그레이션을 실행해야했고 다른 모든 마이그레이션과 독립적으로 다시 실행해야했습니다. 콘솔을 시작하고 다음을 수행하십시오.

>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down

더 유용하게 이것은 레이크 작업 등에 넣을 수 있습니다.


6
이것은 훌륭하게 작동했습니다. 마이그레이션에서 콘솔로 코드를 복사하여 붙여 넣어 클래스를 정의 할 수도 있습니다 (예를 들어 Dev에서 실수 한 경우 필요한 경우 수동 조작이 가능합니다). 를 사용하여 가역적 마이그레이션을 정의한 경우 다음을 change실행하십시오.YourMigrations.migrate(:up) (또는 대신 :down! 너무)
trisweb을

1
당신은해야 할 수도 있습니다 require "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

15

rake db:migrate:up VERSION=version_no

특정 마이그레이션 스크립트를 마이그레이션 (추가)합니다.

rake db:migrate:down VERSION=version_no

특정 마이그레이션 스크립트를 삭제합니다.


10
rake db:migrate VERSION=20098252345

시도해보세요.


7
나는 이것이 당신이 지정한 것까지 모든 마이그레이션을 실행할 것이라고 생각합니다.
Ken Liu

1
닫지 만 특정 마이그레이션 전에 모든 마이그레이션도 실행됩니다.
Anon

6
이전의 마이그레이션을 고려하지 않고 하나의 마이그레이션 만 실행하거나 실행하고 싶지는 않습니다. 마이그레이션은 주어진 시점의 코드와 관련된 데이터베이스 구조의 표현이므로 필요하기 전의 마이그레이션입니다. 당신은 단지 실행하려면 하나의 마이그레이션을 가능성이 높습니다 당신은 기능적인 마이그레이션을 유지하기 위해 작업 아래 적절한 업 / 작성하지 않은 것 ... 그것은 단지 당신의 위로 마이그레이션을 쓰기에 나쁜 습관이다.
JP Silvashy

1
주의 할 점 : VERSION은 환경 변수 일 뿐이므로 명령에서 먼저 오거나 명령 이전에 설정할 수도 있습니다.VERSION=20098252345 rake db:migrate
Joshua Pinter

4
rake db:migrate:redo version='xxxx'   

xxxx를 따옴표로 묶어야합니다. xxxx는 마이그레이션의 타임 스탬프 (또는 마이그레이션 ID)입니다.

다음을 사용하여 이전에 수행 한 마이그레이션에 대한 타임 스탬프 (마이그레이션 ID)를 확인할 수 있습니다.

rake db:migrate:status    

3

위의 korch의 답변을 확장하면 require저에게는 효과가 없었지만 효과 load가있었습니다. 구체적으로 마이그레이션 파일의 경우 :

    class ChangeMinQuantityToRaces < ActiveRecord::Migration
      def change
        change_column :races, :min_quantity, :integer, :default => 0
      end
    end

콘솔 타이핑에서

    > load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
    > ChangeMinQuantityToRaces.new.change

나를 위해 일했습니다.

    > Race.new.min_quantity # => 0 

루비 1.9.3p484 (2013-11-22 개정 43786) [x86_64-linux] 및 Rails 3.2.13 용입니다.


2

이 같은 문제가 발생했기 때문에 여기에 2 ¢ 추가 :

새 마이그레이션을 만들지 않고 마이그레이션을 다시 실행하려는 경우 다음을 수행 할 수 있습니다.

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

그리고 rails는 20150105181157에 대한 마이그레이션을 실행했다는 것을 "잊습니다". 이제 db : migrate를 실행하면 다시 실행됩니다.

이것은 거의 항상 나쁜 생각입니다. 이해가 될 수있는 한 가지 예는 개발 브랜치가 있고 아직 마이그레이션을 구체화하지 않았고 개발 중에 몇 가지를 추가하려는 경우입니다. 하지만 그래도 마이그레이션을 양방향으로 만드는 것이 좋습니다. 그래야 적절하게 롤백하고 반복적으로 재 시도 할 수 있습니다.


1

콘솔을 통해 마이그레이션 클래스를 실행하는 방법이 있어야합니다. 마이그레이션 코드를 인식 할 수없는 것 같습니다.

그러나 의견에서 알 수 있듯이 마이그레이션을 순서대로 실행하는 것이 좋습니다. 사용하다:

rake db:migrate VERSION=##########

스크립트 / 콘솔로 마이그레이션 할 때 코드를 복사하여 붙여 넣으시겠습니까?



0

마이그레이션을 상당히 많이 변경할 때 개발에이 기술을 사용하고, 마이그레이션 과정에서 데이터를 잃어 버리고 싶지는 않습니다 (특히 시간이 오래 걸리는 레거시 데이터를 가져올 때 다시 가져올 필요가 없습니다).

이것은 100 % hackish이며 프로덕션에서 이것을 권장하지는 않지만 트릭을 수행합니다.

  1. 디렉토리에서 재실행하려는 마이그레이션을 임시 위치로 이동하십시오.
  2. 동일한 이름으로 다른 마이그레이션 생성
  3. 원본 마이그레이션 코드를 새로 생성 된 마이그레이션 파일에 복사 / 붙여 넣기
  4. 새 마이그레이션 실행
  5. 새로 생성 된 마이그레이션 파일 삭제
  6. 스키마 마이그레이션을 편집하여 가장 최근 값을 제거하십시오.
  7. 이전 마이그레이션 파일 복원
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.