Como reverter uma migração específica?

807

Eu tenho o seguinte arquivo de migração db\migrate\20100905201547_create_blocks.rb

Como posso reverter especificamente esse arquivo de migração?

Um aprendiz
fonte
1
Isso resolve o problema? Você só precisa fazer Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich
4
Todas as informações sobre migrações Aqui
Nishutosh Sharma
1
Deseja reverter apenas a migração específica única (mesmo se houver migrações mais recentes depois dela)? Ou você deseja reverter o banco de dados para o estado em que estava antes da aplicação da migração e das migrações subseqüentes?
Jon Schneider

Respostas:

1340
rake db:rollback STEP=1

É uma maneira de fazer isso, se a migração que você deseja reverter for a última aplicada. Você pode substituir 1 por quantas migrações quiser voltar.

Por exemplo:

rake db:rollback STEP=5

Também reverterá toda a migração que ocorreu posteriormente (4, 3, 2 e também 1).

Para reverter todas as migrações de volta para (e incluindo) uma migração de destino, use: (Este comando corrigido foi adicionado APÓS todos os comentários apontando o erro na postagem original)

rake db:migrate VERSION=20100905201547

Para reverter APENAS UMA migração específica (FORA DE PEDIDO), use:

rake db:migrate:down VERSION=20100905201547

Observe que isso NÃO reverterá nenhuma migração intercalada - apenas a listada. Se não foi isso que você pretendia, é possível executar com segurança rake db:migratee ele será executado novamente apenas um, ignorando outros que não foram revertidos anteriormente.

E se você quiser migrar uma única migração fora de ordem, também há o inverso db:migrate:up:

rake db:migrate:up VERSION=20100905201547
Zachary Wright
fonte
14
"Para reverter para uma versão específica" - o comando que segue apenas reverte uma migração específica, em vez de reverter para a versão anterior?
Andrew Grimm
10
"Para reverter para uma versão específica, use ..." Esta resposta está incorreta! Isso reverterá a migração isoladamente, conforme explicado por outras respostas.
Rhys van der Waerden
3
AVISO: Cometi este erro: use apenas rake db: migrate: down VERSION = 20100905201547 para reverter EM ISOLAMENTO !!! um arquivo de migração. Isso é mencionado no comentário acima, mas eu perdi.
precisa saber é o seguinte
3
Outra palavra de aviso - nunca faça STEP=-1. Eu fiz isso uma vez e ficou louco, revertendo tudo. Não é legal! Este foi o Rails 4.2 - acho que já pode ser corrigido agora.
Dave Hartnoll
1
Escreveu um artigo em meu blog sobre as migrações, que explica como e quando usar estes comandos: railsguides.net/polish-rails-migrations
ka8725
867
rake db:migrate:down VERSION=20100905201547

reverterá o arquivo específico.


Para encontrar a versão de todas as migrações, você pode usar este comando:

rake db:migrate:status

Ou simplesmente o prefixo do nome do arquivo da migração é a versão que você precisa reverter.


Veja a entrada do guia Ruby on Rails sobre migrações.

John Creamer
fonte
48
Definitivamente a resposta preferida na minha opinião.
streetlogics
30
Vale ressaltar que, se você reverter uma migração específica e não quiser migrar novamente nas próximas tarefas de rake, exclua também o arquivo de migração.
precisa saber é o seguinte
4
Nota: parece que, se a migração up nunca foi bem-sucedida, mas apenas parcialmente executada, a down não faz nada.
Cyrilchampier 9/10
1
@nerith, provavelmente é verdade apenas para bancos de dados que não suportam DDL transacional. O MySQL não suporta DDL transacional: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html O PostreSQL sim: wiki.postgresql.org/wiki/… Portanto, se sua migração no banco de dados MySQL estiver interrompida você precisará excluir manualmente parte da migração que foi bem-sucedida.
25414
1
Outra observação sobre o comentário @BradGreens. Se você deseja remover o arquivo de migração, e ele já foi implantado, você deve reverter a produção / preparação antes de confirmar o código com o arquivo removido. Caso contrário, você não poderá reverter / migrar: para baixo.
AdamT
57

Para reverter a última migração, você pode fazer:

rake db:rollback

Se você deseja reverter uma migração específica com uma versão, faça:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Por exemplo, se a versão for 20141201122027, você fará:

rake db:migrate:down VERSION=20141201122027

para reverter essa migração específica.

Waleed
fonte
32

Você pode reverter sua migração usando rake db:rollbackcom opções diferentes. A sintaxe será diferente de acordo com seus requisitos.

Se você deseja reverter apenas a última migração, poderá usar

rake db:rollback

ou

rake db:rollback STEP=1

Se você deseja reverter o número de migrações de uma só vez, basta passar um argumento:

rake db:rollback STEP=n

onde né o número de migrações para reversão, contando desde a migração mais recente.

Se você deseja reverter para uma migração específica, deve passar a versão da migração da seguinte maneira:

rake db:migrate:down VERSION=xxxxx

onde xxxxx é o número da versão da migração.

uma
fonte
1
acrescentando: para baixo não está funcionando, porém, a resposta correta é sem baixo
Elta3lab
26

rake db:migrate:down VERSION=your_migrations's_version_number_here

A versão é o prefixo numérico no nome do arquivo da migração

Como encontrar a versão :

Seus arquivos de migração são armazenados no seu rails_root/db/migratediretório. Encontre o arquivo apropriado até o qual deseja reverter e copie o número do prefixo.

por exemplo

nome do arquivo: 20140208031131_create_roles.rb a versão é20140208031131

Hardik
fonte
6
A maneira mais simples de encontrar o ID de migração é executarrake db:migrate:status
Aeradriel
18

Revertendo a última migração:

# rails < 5.0
rake db:rollback

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

Revertendo o último nnúmero de migrações

# rails < 5.0
rake db:rollback STEP=2

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

Retrocedendo uma Migração Específica

# 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
Deepak Mahakale
fonte
14

Para reverter a última migração, você pode fazer:

rake db:rollback

Se você deseja reverter uma migração específica com uma versão, faça:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Se o arquivo de migração que você deseja reverter foi chamado db/migrate/20141201122027_create_some_table.rb, a VERSÃO dessa migração será20141201122027 , que é o carimbo de data e hora de quando essa migração foi criada e o comando para reverter essa migração seria:

rake db:migrate:down VERSION=20141201122027
Sandip Vavhal
fonte
6

Se for uma migração reversível e a última que foi executada, execute rake db:rollback. E você sempre pode usar a versão. por exemplo

o arquivo de migração é 20140716084539_create_customer_stats.rb, portanto, o comando de reversão será, rake db:migrate:down VERSION=20140716084539

Santanu
fonte
6

Para reverter todas as migrações até uma versão específica (por exemplo 20181002222222), use:

rake db:migrate VERSION=20181002222222

(Observe que isso é usado db:migrate- não db:migrate:downcomo em outras respostas a esta pergunta.)

Supondo que a versão de migração especificada seja anterior à versão atual, isso reverterá todas as migrações até, mas não incluindo, a versão especificada.

Por exemplo, se for rake db:migrate:statusexibido inicialmente:

  (... 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

Corrida:

rake db:migrate VERSION=20181002222222

Vai resultar em:

  (... 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

Referência: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations

Jon Schneider
fonte
4

Do Guia Rails

Revertendo migrações anteriores

Você pode usar a capacidade do Active Record para reverter migrações usando o revertmétodo:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

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

O revertmétodo também aceita um bloco de instruções para reverter. Isso pode ser útil para reverter partes selecionadas de migrações anteriores. Por exemplo, vamos imaginar que o CreateBlock seja confirmado e mais tarde seja decidido que seria melhor usar as validações do Active Record, no lugar da restrição CHECK, para verificar o CEP.

    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

A mesma migração também poderia ter sido escrita sem o uso de reversão, mas isso envolveria mais algumas etapas: reverter a ordem de create_table e reversible, substituir create_table por drop_table e finalmente substituir up por down e vice-versa. Tudo isso é resolvido por reversão.

Manish Shrivastava
fonte
3

As migrações alteram o estado do banco de dados usando o comando

$ bundle exec rake db:migrate

Podemos desfazer uma única etapa de migração usando

  $ bundle exec rake db:rollback

Para voltar ao começo, podemos usar

  $ bundle exec rake db:migrate VERSION=0

Como você pode imaginar, a substituição de qualquer outro número por 0 migra para esse número de versão, onde os números de versão vêm listando as migrações sequencialmente

Nirupa
fonte
2

Bem, no Rails 5 é bastante fácil o rake db: migrate: status ou o rails db: migrate: status

Foi modificado para lidar da mesma maneira. Em seguida, escolha a versão que você deseja reverter e execute o rake db: migrate VERSION = 2013424230423

Verifique se VERSION possui todas as letras maiúsculas

Se você tiver algum problema com alguma etapa da migração ou ficar preso no meio, simplesmente vá para o arquivo de migração e comente as linhas que já foram migradas.

espero que ajude

Shahin
fonte
1
Destaco a dica para o comando rake db: migrate: status . . . É ótimo para a visão geral ver o estado atual de execução dos arquivos de migração.
beleza
1

Se você deseja reverter e migrar, você pode executar:

rake db:migrate:redo

É o mesmo que:

rake db:rollback
rake db:migrate
Iwan B.
fonte