특정 마이그레이션을 롤백하는 방법은 무엇입니까?


807

다음 마이그레이션 파일이 있습니다 db\migrate\20100905201547_create_blocks.rb

해당 마이그레이션 파일을 구체적으로 롤백하려면 어떻게해야합니까?


1
이것이 문제를 해결합니까? Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich

4
마이그레이션에 대한 모든 정보는 여기
Nishutosh Sharma

1
새로운 단일 마이그레이션이 있더라도 해당 단일 특정 마이그레이션 만 롤백 하시겠습니까? 또는 데이터베이스를 마이그레이션하기 전의 상태로 롤백하고 후속 마이그레이션을 적용 하시겠습니까?
Jon Schneider

답변:


1340
rake db:rollback STEP=1

롤백하려는 마이그레이션이 마지막으로 적용된 경우이를 수행하는 방법입니다. 되돌아 가고 싶은 많은 마이그레이션을 1 대신 사용할 수 있습니다.

예를 들면 다음과 같습니다.

rake db:rollback STEP=5

또한 나중에 발생한 모든 마이그레이션 (4, 3, 2 및 1)을 롤백합니다.

대상 마이그레이션으로 (그리고 포함하여) 모든 마이그레이션을 롤백하려면 다음을 사용하십시오.

rake db:migrate VERSION=20100905201547

하나의 특정 마이그레이션 (OUT OF ORDER) 만 롤백하려면 다음을 사용하십시오.

rake db:migrate:down VERSION=20100905201547

이렇게하면 진행중인 마이그레이션이 롤백되지 않으며 나열된 마이그레이션 만 롤백됩니다. 이것이 의도 한 것이 아닌 경우 안전하게 실행할 수 rake db:migrate있으며 이전에 롤백되지 않은 다른 항목은 건너 뛰고 해당 항목 만 다시 실행합니다.

단일 마이그레이션을 순서대로 마이그레이션하지 않으려는 경우에는 반대의 결과도 있습니다 db:migrate:up.

rake db:migrate:up VERSION=20100905201547

14
"특정 버전으로 롤백하려면"-다음 명령이 특정 버전으로 롤백하는 대신 특정 마이그레이션 만 롤백하지 않습니까?
Andrew Grimm

10
"특정 버전 사용으로 롤백하려면 ..." 이 답변이 잘못되었습니다! 다른 답변에서 설명한 것처럼 마이그레이션을 분리하여 롤백합니다.
Rhys van der Waerden

3
경고 : 나는이 실수를했다 : rake db : migrate : down VERSION = 20100905201547 만 사용하여 격리에서 롤백하십시오! 하나의 마이그레이션 파일. 이것은 위의 의견에서 언급되었지만 놓쳤습니다.
pixelearth

3
경고의 또 다른 단어-절대로하지 마십시오 STEP=-1. 나는 한 번 그렇게했고 모든 것을 롤백, 화가났다. 좋지 않아! 이것은 Rails 4.2였습니다. 지금 수정되었을 것입니다.
Dave Hartnoll


867
rake db:migrate:down VERSION=20100905201547

특정 파일을 롤백합니다.


모든 마이그레이션 버전을 찾으려면 다음 명령을 사용할 수 있습니다.

rake db:migrate:status

또는 단순히 마이그레이션 파일 이름의 접두사가 롤백해야하는 버전입니다.


마이그레이션 에 대한 Ruby on Rails 안내서 항목 을 참조하십시오 .


48
내 의견으로는 분명히 선호되는 대답입니다.
streetlogics

30
특정 마이그레이션을 롤백하고 향후 레이크 작업에서 다시 마이그레이션하지 않으려면 마이그레이션 파일도 삭제하십시오.
BradGreens

4
참고 : 업 마이그레이션이 성공하지 못했지만 부분적으로 만 실행 된 경우 다운은 아무 것도 수행하지 않는 것 같습니다.
cyrilchampier

1
@nerith, Transactional DDL을 지원하지 않는 데이터베이스의 경우에만 해당됩니다. MySQL은 트랜잭션 DDL을 지원하지 않습니다 dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL가 수행합니다 wiki.postgresql.org/wiki/...를 MySQL 데이터베이스에 마이그레이션이 깨진 경우 그래서 그런 다음 성공한 마이그레이션의 일부를 수동으로 삭제해야합니다.
Иван Бишевац

1
@BradGreens 의견에 관한 또 다른 관찰. 마이그레이션 파일을 제거하고 이미 배포 한 경우 제거 된 파일로 코드를 커밋하기 전에 프로덕션 / 스테이지를 롤백해야합니다. 그렇지 않으면 롤백 / 마이그레이션 : 다운을 수행 할 수 없습니다.
AdamT

57

마지막 마이그레이션을 롤백하려면 다음을 수행하십시오.

rake db:rollback

버전으로 특정 마이그레이션을 롤백하려면 다음을 수행하십시오.

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

예를 들어 버전이 20141201122027 인 경우 다음을 수행하십시오.

rake db:migrate:down VERSION=20141201122027

특정 마이그레이션을 롤백합니다.


32

rake db:rollback다른 옵션과 함께 사용하여 마이그레이션을 롤백 할 수 있습니다. 구문은 요구 사항에 따라 다릅니다.

마지막 마이그레이션 만 롤백하려면 다음 중 하나를 사용할 수 있습니다.

rake db:rollback

또는

rake db:rollback STEP=1

롤백 횟수의 마이그레이션을 한 번에 수행하려면 인수를 전달하면됩니다.

rake db:rollback STEP=n

어디 n롤백에 대한 마이그레이션의 수는 최근 마이그레이션에서 계산이다.

특정 마이그레이션으로 롤백하려면 다음에서 마이그레이션 버전을 전달해야합니다.

rake db:migrate:down VERSION=xxxxx

여기서 xxxxx는 마이그레이션의 버전 번호입니다.


1
추가 : 아래로 작동하지 않지만 정답은 다운되지 않습니다
Elta3lab

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

버전은 마이그레이션 파일 이름의 숫자 접두사입니다.

버전을 찾는 방법 :

마이그레이션 파일은 rails_root/db/migrate디렉토리에 저장됩니다 . 롤백 할 적절한 파일을 찾고 접두사 번호를 복사하십시오.

예를 들어

파일 이름 : 20140208031131_create_roles.rb 그러면 버전은20140208031131


6
마이그레이션 ID를 찾는 가장 간단한 방법은 다음을 실행하는 것입니다.rake db:migrate:status
Aeradriel

18

마지막 마이그레이션 롤백 :

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

마지막 n마이그레이션 횟수 롤백

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

특정 마이그레이션 롤백

# rails < 5.0
rake db:migrate:down VERSION=20100905201547

# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547

14

마지막 마이그레이션을 롤백하려면 다음을 수행하십시오.

rake db:rollback

버전으로 특정 마이그레이션을 롤백하려면 다음을 수행하십시오.

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

롤백하려는 마이그레이션 파일이 호출 된 경우 해당 마이그레이션 db/migrate/20141201122027_create_some_table.rb의 버전은 해당 마이그레이션이 20141201122027작성된 시간 소인이며 마이그레이션을 롤백하는 명령은 다음과 같습니다.

rake db:migrate:down VERSION=20141201122027

6

가역 마이그레이션이고 마지막으로 실행 된 마이그레이션 인 경우 다음을 실행하십시오. rake db:rollback . 그리고 당신은 항상 버전을 사용할 수 있습니다. 예 :

마이그레이션 파일은 20140716084539_create_customer_stats.rb이므로 롤백 명령은 다음과 같습니다. rake db:migrate:down VERSION=20140716084539


6

모든 마이그레이션을 특정 버전 (예 :)으로 롤백하려면 20181002222222다음을 사용하십시오.

rake db:migrate VERSION=20181002222222

(이것은 db:migrate-db:migrate:down .이 질문에 대한 다른 답변에서와 같이)

지정된 마이그레이션 버전이 현재 버전보다 오래되었다고 가정하면 지정된 버전까지는 포함하지 않는 모든 마이그레이션을 롤백합니다.

예를 들어, rake db:migrate:status처음에 표시되는 경우 :

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  up      20181003171932  Some migration description
  up      20181004211151  Some migration description
  up      20181005151403  Some migration description

달리는:

rake db:migrate VERSION=20181002222222

결과는 다음과 같습니다.

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  down    20181003171932  Some migration description
  down    20181004211151  Some migration description
  down    20181005151403  Some migration description

참조 : https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations


4

에서 레일 가이드

이전 마이그레이션 되돌리기

다음 revert방법을 사용하여 Active Record의 마이그레이션 롤백 기능을 사용할 수 있습니다 .

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

revert방법은 또한 명령 블록을 되돌려받습니다. 이전 마이그레이션에서 선택한 부분을 되 돌리는 데 유용 할 수 있습니다. 예를 들어 CreateBlock이 커밋되고 나중에 CHECK 제약 조건 대신 Active Record 유효성 검사를 사용하여 우편 번호를 확인하는 것이 가장 좋습니다.

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute <<-SQL
                ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                    CHECK (char_length(zipcode) = 5);
              SQL
            end
            dir.down do
              execute <<-SQL
                ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
              SQL
            end
          end

          # The rest of the migration was ok
        end
      end
    end

revert를 사용하지 않고 동일한 마이그레이션을 작성할 수도 있었지만 create_table과 reversible의 순서를 바꾸고 create_table을 drop_table로 바꾸고 마지막으로 down과 반대로 바꾸는 몇 가지 단계가 더 필요했습니다. 이것은 모두 되돌리기에 의해 처리됩니다.


3

마이그레이션은 명령을 사용하여 데이터베이스의 상태를 변경합니다

$ bundle exec rake db:migrate

다음을 사용하여 단일 마이그레이션 단계를 취소 할 수 있습니다.

  $ bundle exec rake db:rollback

처음부터 다시 시작하려면

  $ bundle exec rake db:migrate VERSION=0

짐작할 수 있듯이 0을 다른 숫자로 바꾸면 해당 버전 번호로 마이그레이션됩니다. 여기서 버전 번호는 마이그레이션을 순차적으로 나열하는 데 사용됩니다.


2

레일 5에서는 db : migrate : status 또는 rails db : migrate : status가 매우 쉽습니다.

동일한 방식으로 처리하도록 수정 된 다음 롤백하려는 버전을 선택한 다음 rake db : migrate VERSION = 2013424230423을 실행하십시오.

VERSION이 모두 대문자인지 확인하십시오

마이그레이션 단계에 문제가 있거나 중간에 멈춘 경우 마이그레이션 파일로 이동하여 이미 마이그레이션 된 행을 주석 처리하십시오.

희망이 도움이


1
rake db : migrate : status 명령에 대한 힌트를 강조 표시합니다 . . . 마이그레이션 파일의 현재 실행 상태를 확인하는 것이 좋습니다.
뷰티

1

롤백 및 마이그레이션하려는 경우 다음을 실행할 수 있습니다.

rake db:migrate:redo

그것은 다음과 같습니다 :

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