2012-07-03 32 views
36

Escribo mi primera aplicación Rails. He ejecutado algunos comandos rails generate model ... y rake db:migrate, pero ahora quiero cambiar mi modelo de datos y, por lo tanto, debo deshacer algunas migraciones.rake db: rollback no funciona?

El docs dice que puedo deshacer una migración con rake db:rollback, pero esto no está funcionando. Cuando ejecuto esto en la consola, la computadora piensa durante unos segundos, pero no realiza ningún cambio en db/migrate/ o db/migrate/schema.rb. No se imprime ningún resultado en la consola.

¿Este comportamiento es correcto? ¿No debería db:rollback cambiar mi esquema? Si es así, ¿alguien puede pensar por qué podría no estar funcionando?

I'm on Rails v. 3.2.6.

EDITAR

Por el momento rake db:migrate:status da

database: db/development.sqlite3 

Status Migration ID Migration Name 
-------------------------------------------------- 
    up  20120617191211 Create irs 
    up  20120701154357 Create paths 
    up  20120701154421 Create nodes 
    up  20120702151447 ********** NO FILE ********** 
    down 20120702155140 Create venues 
    down 20120703233833 Remove path from venues 
+2

Quizás nos proporcione la salida de 'rake db: migrate: status'. – Peter

+0

bien, hecho. NO FILE se ve un poco siniestro ... ¿es parte del problema? –

+3

Sí. 'db: rollback' ejecuta el método down en la última migración aplicada, que en este caso parece ser una en la que falta el archivo. –

Respuesta

59

solución (ver mi comentario): ejecutar

rake db:migrate:status 

y corregir los problemas que encuentre allí. En este caso (por seguimiento de @MarkThomas), es posible que desee verificar que todos los archivos que necesita estén en su lugar.

+11

Gracias, esto funcionó. Extrañamente, sin embargo, nunca pude encontrar un archivo con la identificación de la migración que los rieles estaban buscando (20120702151447). Al final creé un archivo "ficticio" con el nombre '20120702151447_create_nothing.rb', y el cuerpo' class CreateNothing

+8

Tenía algunos archivos de migración faltantes debido a la eliminación de una gema de forma manual. En lugar de crear el archivo ficticio, eliminé los registros de la tabla 'schema_migrations', como:' eliminar de schema_migrations donde versión en ('20150424220749', '20150424220748'); 'Eso lo solucionó para mí. – Derek

+0

@Derek que debería ser una respuesta –

3

Si

rake db:migrate:status 

le da una migración que dice

up 20120702151447 ********** NO FILE **********

Entonces la mejor cosa a hacer sería hacer un (tenga en cuenta que el siguiente comando se reducirá la base de datos):

rake db:reset 

para rehacer todas las migraciones. Si la última migración es el que encuentra, entonces schema.rb tendrá la última migración que rake db:migrate buscará:

ActiveRecord::Schema.define(:version => 20120702151447) do

Cambiar el número a la última en su carpeta de migración.

+0

Si tiene usuarios y autenticación, asegúrese de tomar las medidas necesarias para no bloquearse. Por ejemplo, agregue a su usuario en db/seed.rb. – iconoclast

+2

Fwiw, cuando tuve este problema fue porque había ejecutado una migración y luego, al necesitar insertar una solución rápida de errores antes de seguir trabajando en la función relacionada con la migración, 'git escondió' mis cambios locales sin primero hacer una reversión . Teniendo esto en cuenta, el mejor enfoque podría ser primero destrabar, revertir, y luego ocultar de nuevo. – clozach

+9

!! Recuerde que rake db: reset arrojará su base de datos actual y perderá todos sus datos. Asegúrate de que eso es lo que quieres hacer. – user1515295

1

Esto es lo que funcionó para mí. Combine los pasos dados en this answer y comente por dB.

  1. carrera de rake db: migrate: estado
  2. Si usted tiene un **** **** NO entrada de archivo, simplemente tenga en cuenta el número de versión que noFileVersion. Tenga en cuenta la versión de la entrada justo arriba de la entrada de ningún archivo (stable_version).
  3. creado un archivo "de prueba" con el nombre noFileVersion_create_nothing.rb, y el cuerpo class CreateNothing < ActiveRecord::Migration def change end end
  4. carrera de rake db: migrate VERSION = stable_version
  5. quitar el noFileVersion_create_nothing.rb manualmente.
  6. ejecutar rake db: migrate.
  7. run rake db: migrate: status again para comprobar si no ha desaparecido ninguna entrada de archivo.
Cuestiones relacionadas