2012-03-07 19 views
11

He terminado con 9 migraciones duplicadas de forma efectiva. (Creo que esto se debe a que instalé/actualicé Gems y/o obtuve sus migraciones en mis máquinas de desarrollo y producción, pero no estoy del todo seguro en este momento).Migraciones de Marcar rieles como migradas

He movido un juego de 9 duplicado de los carriles de directorios en el servidor de producción, pero ahora que quiero db:migrate en la producción con el fin de ejecutar otra migración, estoy recibiendo:

$ bundle exec rake db:migrate RAILS_ENV=production 
[DEPRECATION WARNING] Nested I18n namespace lookup under "activerecord.attributes.checkout" is no longer supported 
== CreatePages: migrating ==================================================== 
-- create_table(:pages) 
rake aborted! 
An error has occurred, all later migrations canceled: 

Mysql2::Error: Table 'pages' already exists: CREATE TABLE `pages` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `body` text, `slug` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB 

Esto se debe a que las migraciones han sido efectivamente ya plazo.

Prefiero evitar hacer db:migrate:down y db:migrate:up para cada uno - Creo que esto significará que los datos en la base de datos de producción se perderán. (Un par de páginas estáticas en Spree en este caso.)

¿Hay alguna forma en que pueda decirle a esta instalación de Rails que olvide todas las migraciones pendientes, marcando efectivamente todas las migraciones pendientes como hechas?

Respuesta

6

Puede agregar las marcas de tiempo de las migraciones a la tabla schema_migrations. Sin embargo, ¿por qué falta esa tabla en la base de datos o faltan las filas que necesita?

Es posible que esta migración en particular haya quedado a medio camino y haya fallado, por lo tanto, cuando intente ejecutarla de nuevo, la primera parte de la migración no funcionará como se hizo anteriormente. Esta es una limitación de MySQL, ya que no puede revertir los cambios de migración que fallan durante el proceso. Postgres, por otro lado, puede deshacer los cambios estructurales en la base de datos evitando así este problema.

+0

Gracias - esto suena como debería hacer el truco. Voy a intentarlo. Creo que estoy en esta situación porque las 9 migraciones involucradas se crearon una vez en mis máquinas tanto de desarrollo como de desarrollo (por lo tanto, lo que efectivamente es la misma migración tiene dos migraciones cada una con su propia marca de tiempo). Los primeros 9 fueron ejecutados, pero luego obtuve otros 9 de mi máquina de desarrollo, de ahí la queja sobre la tabla que ya existe. Todavía estoy aprendiendo a instalar y actualizar Gems con respecto a la implementación. –

+0

Um, ¿por qué tienes migraciones duplicadas que son las mismas pero con diferentes marcas de tiempo? La idea detrás de las migraciones es que tiene un conjunto de migraciones (es decir, cambios en la estructura de la base de datos) que todos utilizan. La base de datos tiene una tabla para realizar un seguimiento de las migraciones que ya se han ejecutado, por lo que no se ejecutarán dos veces en cada entorno (desarrollo/producción). –

+0

De hecho. Creo que esto podría deberse a que anteriormente instalé gemas (incluidas sus migraciones asociadas) en ambas máquinas sin darme cuenta de la implicación. Necesito ordenar el flujo de trabajo. –

8

De manera predeterminada, rake db:migrate ejecuta todas las migraciones pendientes. Entonces, para que sus migraciones sean correctas ... por el bien ... comente esas migraciones y luego invierta esas a la normalidad. Garantizará que esté bien en futuras migraciones.

10

Lo resuelto de esta manera:

  1. Ir al archivo de migración en conflicto.

  2. Borre el contenido y guárdelo.

  3. Run rake db:migrate

  4. Ctrl + Z en el archivo al estado anterior.

Este fue un caso especial, porque había copiado el DB de otra aplicación, y tenía migraciones conflictivas, y otras cosas.

+0

Sí, este es un muy buen trabajo. Gracias. Pero todavía me pregunto si hay algunas otras soluciones para esto. –

+3

Quería agregar una aclaración: No borre todo el contenido. Simplemente borre todo entre la declaración de clase y el final. Al eliminar todo, se producirá este error debido a una falta de coincidencia entre el nombre de archivo y el nombre de clase: http://stackoverflow.com/questions/17776900/error-on-dbmigrate-uninitialized-constant-devisecreateusers – Dreyfuzz

Cuestiones relacionadas