Cómo eliminar archivos de migración en Rails 3

109

Me gustaría eliminar / eliminar un archivo de migración. ¿Cómo haría yo para hacer eso? Sé que hay preguntas similares aquí, pero como actualización, ¿hay una mejor manera que hacer un script / destruir?

Además, ¿debo hacer una db:reseto db:dropsi elimino / elimino una migración?

alvincrespo
fuente

Respuestas:

142

Yo suelo:

  1. Realice una rake db:migrate VERSION=XXXen todos los entornos, a la versión anterior a la que quiero eliminar.
  2. Elimine el archivo de migración manualmente.
  3. Si hay migraciones pendientes (es decir, la migración que eliminé no fue la última), simplemente realizo una nueva rake db:migratenuevamente.

Si su aplicación ya está en producción o en etapa de prueba, es más seguro simplemente escribir otra migración que destruya su tabla o columnas.

Otra gran referencia para las migraciones es: http://guides.rubyonrails.org/migrations.html

Fábio Batista
fuente
2
¿Eliminar la migración y luego ejecutar un db: migrate eliminaría la tabla que se creó?
alvincrespo
2
No, ya que Rails no sabría cómo eliminarlo. Necesita llamar al self.downmétodo definido en su migración para "degradar" su base de datos.
Fábio Batista
35
Si ya eliminó el archivo, sin darse cuenta, los rieles no lo soltarán tan fácilmente, rake db:migrate:statusle mostrarán el ID del archivo que falta, que puede usar para recrearlo. Una vez que regrese, puede seguir los consejos de esta respuesta para la victoria.
Jordan Feldstein
1
@JordanFeldstein, gracias. db:migrate:statuses un salvavidas!
dee
1
@Lucas, una vez que se elimina el archivo de migración, ya no se puede revertir. Es por eso que debe revertirlo en todos los entornos que ya ejecutó (producción, desarrollo, pruebas, preparación, etc.) antes de eliminar su archivo. Por eso también escribí que es más seguro simplemente crear otra migración para revertir la anterior, una vez que ya se ejecutó en producción.
Fábio Batista
68

Otra forma de eliminar la migración:

$ rails d migration SameMigrationNameAsUsedToGenerate

Úselo antes de que rake db:migratese ejecute porque los cambios en la base de datos permanecerán para siempre :) - o elimine los cambios manualmente

Gediminas
fuente
3
"Si su aplicación ya está en producción o en etapa de prueba, es más seguro simplemente escribir otra migración que destruya su tabla o columnas". Así que los cambios no permanecen en la base de datos para siempre
JohnMerlino
8
Por cierto, "d" significa "destruir".
Greg M. Krsak
21

Ejecute los siguientes comandos desde el directorio de inicio de la aplicación:

  1. rake db:migrate:down VERSION="20140311142212" (aquí la versión es la marca de tiempo precedida por rieles cuando se creó la migración. Esta acción revertirá los cambios en la base de datos debido a esta migración)

  2. Run "rails destroy migration migration_name"(Migration_name es el que se eligió al crear la migración. Elimine " timestamp_ " del nombre de su archivo de migración para obtenerlo)

zorro
fuente
rake destruir migración AddFileToTable rake abortado! No sé cómo compilar la tarea 'destruir' (ver seguimiento completo ejecutando la tarea con --trace)
sadaf2605
3
Para el # 2 el comando correcto es:rails d migration migration_name
mauriciomdea
1
Gracias por la pista "eliminar marca de
tiempo_
10

También puede ejecutar una migración descendente como esta:

rake db:migrate:down VERSION=versionnumber

Consulte la guía de Ruby on Rails sobre migraciones para obtener más información.

Vicky
fuente
9

Nosotros podemos usar,

$ rails d migration table_name  

Lo que eliminará la migración.

Inés
fuente
1
Creo que debería ser el nombre del modelo en lugar de table_name
Ajeet Khan
3

A veces me encontré borrando el archivo de migración y luego borrando la entrada correspondiente en la tabla schema_migrations de la base de datos. No es bonita, pero funciona.

frenesim
fuente
3

Esto también funciona en Rails 5.

Si la migración fue la más reciente, puede eliminar las columnas de la base de datos que agregó la migración haciendo lo siguiente:

rake db:rollback

luego elimine el archivo de migración ejecutando:

rails d migration WhateverYourMigrationWasNamed.rb 
random_user_0891
fuente
1

Ninguna de estas respuestas se ajusta al problema que tenía, ya que faltaba la migración que quería eliminar: había creado y ejecutado una migración en alguna otra rama, que luego se descartó. El problema es que cuando se ejecuta una migración, rails agrega la versión a una schema_migrationstabla en la base de datos. Entonces, incluso si no aparece en la estructura o esquema de su base de datos, rails lo busca. Puede revelar estas migraciones huérfanas ejecutando:

rails db:migrate:status

Tenga en cuenta las versiones de las migraciones que faltan y diríjase a la consola de db:

rails dbconsole

Ahora elimine las versiones de la tabla de migración manualmente:

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

Ahora deberías estar bien.

stackPusher
fuente
0

Acabo de tener este mismo problema:

  1. rails d migration fuu: se eliminó la migración con la última marca de tiempo
  2. rails d migración fuu -esto borró la otra migración
  3. use git status para verificar que ya no esté en los archivos sin seguimiento
  4. rieles g migración fuu

Eso me lo arregló

Miguel Alatorre
fuente
0

Nota al margen: Comenzar en rieles 5.0.0 rakese ha cambiado a rails Así que realice lo siguiente

rails db: migrate VERSION = 0

Mohamed Daw
fuente