Como deletar arquivos de migração no Rails 3

109

Eu gostaria de remover / excluir um arquivo de migração. Como eu faria isso? Eu sei que existem perguntas semelhantes aqui, mas como uma atualização, há uma maneira melhor do que fazer script / destruir?

Além disso, devo fazer db:resetou db:dropse eu remover / excluir uma migração?

alvincrespo
fonte

Respostas:

142

Eu normalmente:

  1. Execute um rake db:migrate VERSION=XXX em todos os ambientes, para a versão anterior àquela que desejo excluir.
  2. Exclua o arquivo de migração manualmente.
  3. Se houver migrações pendentes (ou seja, a migração que removi não foi a última), acabo de realizar uma nova rake db:migratenovamente.

Se seu aplicativo já estiver em produção ou teste, é mais seguro apenas escrever outra migração que destrua sua tabela ou colunas.

Outra ótima referência para migrações é: http://guides.rubyonrails.org/migrations.html

Fábio Batista
fonte
2
Excluir a migração e executar um db: migrate limparia a tabela que foi criada?
alvincrespo,
2
Não, já que Rails não saberia como excluí-lo. Ele precisa chamar o self.downmétodo definido em sua migração para "fazer downgrade" de seu banco de dados.
Fábio Batista
35
Se você já deletou o arquivo, sem perceber o rails não vai largar tão facilmente, rake db:migrate:statusvai te mostrar o ID do arquivo que falta, que você pode usar para recriá-lo. Quando voltar, você pode seguir o conselho desta resposta para a vitória.
Jordan Feldstein,
1
@JordanFeldstein, obrigado. db:migrate:statusé um salva-vidas!
dee
1
@Lucas, uma vez que o arquivo de migração é removido, não pode mais ser revertido. É por isso que você deve revertê-lo em todos os ambientes que já executou (produção, desenvolvimento, teste, teste, etc) antes de excluir seu arquivo. Também é por isso que escrevi que é mais seguro apenas criar outra migração para reverter a antiga, uma vez que já foi executado em produção.
Fábio Batista
68

Outra maneira de excluir a migração:

$ rails d migration SameMigrationNameAsUsedToGenerate

Use-o antes de rake db:migrateser executado porque as alterações no banco de dados permanecerão para sempre :) - ou remova as alterações manualmente

Gediminas
fonte
3
"Se seu aplicativo já está em produção ou teste, é mais seguro apenas escrever outra migração que destrua sua tabela ou colunas." Portanto, as alterações não ficam no banco de dados para sempre
JohnMerlino
8
A propósito, "d" significa "destruir".
Greg M. Krsak
21

Execute os comandos abaixo do diretório inicial do aplicativo:

  1. rake db:migrate:down VERSION="20140311142212" (aqui a versão é o carimbo de data / hora prefixado por trilhos quando a migração foi criada. Esta ação irá reverter as alterações do banco de dados devido a esta migração)

  2. Run "rails destroy migration migration_name"(migration_name é o único uso escolhido ao criar a migração. Remova " timestamp_ " do nome do arquivo de migração para obtê-lo)

Raposa
fonte
rake destroy migration AddFileToTable rake abortado! Não sei como construir a tarefa 'destruir' (veja o rastreamento completo executando a tarefa com --trace)
sadaf2605
3
Para o nº 2, o comando correto é:rails d migration migration_name
mauriciomdea
1
Obrigado pela dica "remove timestamp_" que eu precisava
LightMan de
10

Você também pode executar uma migração para baixo como:

rake db:migrate:down VERSION=versionnumber

Consulte o guia Ruby on Rails sobre migrações para obter mais informações.

Vicky
fonte
9

Podemos usar,

$ rails d migration table_name  

O que excluirá a migração.

Agnes
fonte
1
Eu acho que deveria ser o nome do modelo em vez de table_name
Ajeet Khan
3

Às vezes, eu me pegava excluindo o arquivo de migração e, em seguida, excluindo a entrada correspondente na tabela schema_migrations do banco de dados. Não é bonito, mas funciona.

frenesim
fonte
3

Isso também funciona no Rails 5.

Se a migração foi a mais recente, você pode remover a (s) coluna (s) do banco de dados que a migração adicionou fazendo:

rake db:rollback

em seguida, remova o próprio arquivo de migração executando:

rails d migration WhateverYourMigrationWasNamed.rb 
random_user_0891
fonte
1

Nenhuma dessas respostas se encaixa perfeitamente no problema que eu tive, pois a migração que eu queria excluir estava faltando: Eu criei e executei uma migração em algum outro branch, que foi então descartada. O problema é que quando uma migração é executada, o rails adiciona a versão em uma schema_migrationstabela no banco de dados. Portanto, mesmo que não esteja listado em sua estrutura ou esquema de banco de dados, o rails procura por ele. Você pode revelar essas migrações órfãs executando:

rails db:migrate:status

Observe as versões das migrações ausentes e acesse o console do db:

rails dbconsole

Agora remova as versões da tabela de migração manualmente:

delete from schema_migrations where version='<version>';

Você agora deve estar bem.

stackPusher
fonte
0

Eu apenas tive o mesmo problema:

  1. rails d migração fuu - isso excluiu a migração com o último timestamp
  2. rails d migration fuu - isso excluiu a outra migração
  3. use git status para verificar se não está mais nos arquivos não rastreados
  4. rails g migração fuu

Isso consertou para mim

Miguel Alatorre
fonte
0

Nota lateral: a partir de rails 5.0.0 rakefoi alterado pararails Portanto, execute o seguinte

rails db: migrate VERSION = 0

Mohamed Daw
fonte