Ruby on Rails: Como posso reverter uma migração com rake db: migrate?

94

Depois de instalar o usuário MODEL do devise, entendi.

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end

Agora, se eu fizer rake db: migrate, a tabela de usuários será criada.

Como posso reverter essa migração, ou seja, como posso deletar a tabela de usuários usando o rake novamente?

evitativamente
fonte

Respostas:

147

Execute o seguinte comando

rake db:migrate:down VERSION=<version>

onde <version>é o número da versão do arquivo de migração que você deseja reverter.

por exemplo. se você deseja reverter uma migração com o nome de arquivo 3846656238_create_users.rb

rake db: migrate: down VERSION = 3846656238

Mahesh
fonte
Estou recebendo um, UnknownMigrationVersionErrormas descobri que é porque minhas migrações estão dentro db/migrate/main, alguém sabe uma solução alternativa para isso db:migrate:downolhar dentro desse diretório específico ou dos subdiretórios de migração?
tf.rz
Isso é apenas para trilhos 3 em diante. Minha vida está nos trilhos 2. Tão triste
morhook
@morhook Isso funciona para o trilho 3 também. Verifique os documentos aqui guias.rubyonrails.org/v3.2/migrations.html
Mahesh
Você está certo! Ele funciona para os trilhos 2 e 3. Obrigado @Mahesh por sua contribuição!
morhook
114

Basta executar este comando:

rake db:rollback
Damienbrz
fonte
65

Acredito que haja três opções disponíveis para reverter migrações (elas também se sobrepõem):

  1. Role para baixo a migração mais recente :

    rake db:migrate:down # Rails 2 apenas.

  2. Role um número (n) de migrações recentes:

    rake db:rollback STEP=n

  3. Role para uma versão anterior específica :

    $ rake db:migrate:down VERSION=nnn # Rails 3 (forneça também o número da versão).

Número da versão significa SHA (Secure Hash Algorithm) para o commit, que é um longo número hexadecimal que se parece com 886af3194768917c78e ... Você pode ver isso fazendo git log

Você pode ver esses comandos (e outros) com suas descrições, usando o rake -T db:qual para o rails 3.2 inclui:

rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n)
Michael Durrant
fonte
5
Role para uma versão específica:rake db:migrate VERSION=<version number>
Ajedi32
3
Pelo menos para o rails 3.0.20, o primeiro comando está errado. Um único rake db:migrate:downaborta com a mensagem de erro "VERSION is required". O recomendado, rake db:rollback entretanto, funciona.
Martin
Conforme detalhado na resposta, Rails 2 SOMENTE para o primeiro comando.
Michael Durrant
1
As variáveis ​​de ambiente STEPVERSION
diferenciam
Para esclarecer, $ rake db:migrate:down VERSION=nnnnão rola para uma versão, ele migra para a versão especificada.
johnml
15

Você pode fazer rollback e especificar quantas últimas migrações serão revertidas, por exemplo

rake db:rollback STEP=3

para as 3 últimas migrações.

dobrar
fonte
esta é uma maneira mais rápida e fácil, em vez de procurar números de versão se você quiser desfazer as últimas migrações
Pré-alfa
11

Como um novo programador (ou para outros novos programadores)

rake db:rollbackfunciona na metade do tempo. Eu começo por aí.

Se não, rake db:migrate:down VERSION=3846656238

conecte VERSION para o número da versão do seu arquivo de migração que você deseja reverter.

LukeBickleTWA
fonte
10
rake db:migrate:redo

Isso vai desfazer e reaplicar a última migração.

Keneth
fonte
5

Para trilhos 5, podemos usar rails command instead of rake

rails db:migrate:down VERSION=<version>

exemplo

rails db: migrate: down VERSION = 20170330090327

Mihir Kumar Thakur
fonte
2

Execute este comando em seu terminal:

rake db:migrate:status

ou

bundle exec rake db:migrate:status

Ele mostra o status, IDs de migração, nome de migração para todas as migrações que executamos anteriormente. selecione seu id de migração (ou seja, seu número de versão) e coloque esse id no seguinte comando após version = ,,, e pressione enter

bundle exec rake db:migrate:down VERSION=
Arun JP
fonte
0

Como reverter uma migração

(1) Identifique primeiro o ID de migração

rake db:migrate:status

  • Copie o número de identificação.

Identifique a migração para reverter.

(2) Em seguida, reverta a migração

rake db:migrate:down VERSION=20190802023239

  • Cole o número de identificação relevante acima. Claro, no seu caso, o ID de migração será diferente! Use o ID de migração correto.

....... e agora você está pronto para as corridas!

BKSpurgeon
fonte