2009-06-17 19 views
20

¿Rake db: migrate solo agrega nuevas migraciones, o deja caer todas las migraciones/cambios y crea todo lo nuevo?exactamente qué hace rake db: migrate do?

Creo que rake está arrojando un error porque está intentando acceder a un atributo de tabla en la migración 040 que se eliminó en la migración 042. de alguna manera mi base de datos y mi rastrillo no están sincronizados y quiero solucionarlos.

para usted los expertos por ahí - ¿Es común que el rastrillo para conseguir fuera de sincronía con las migraciones? cómo puedo evitar esto (no, no edito a mano mi esquema o rake).

Respuesta

14

Cada vez que se crea una migración mediante secuencias de comandos (como script/generar el modelo ...) se añade una nueva migración en el directorio correcto listo para ser sincronizada con la base de datos real.

rastrillo En realidad db: migrate sólo comprueba que todavía se deben aplicar a la base de datos sin preocuparse por las migraciones previouse que faltan.

Por supuesto, si modifica la base de datos usando otras formas, es común obtener elementos fuera de sincronización porque, como dijo, puede encontrarse aplicando una migración a algo que se modifica debajo.

21

Cuando utiliza migraciones de rieles, se crea automáticamente una tabla llamada schema_migrations, que realiza un seguimiento de las migraciones que se han aplicado almacenando el número de versión de cada migración (este es el número que antecede al nombre de la migración en el nombre del archivo , es decir, db/migrate/_20090617111204__migration.rb). Cuando ejecute rake db:migrate para migrar, solo se ejecutarán las migraciones que no se hayan ejecutado anteriormente (es decir, su versión no esté incluida en la tabla) (por este motivo, cambiar una migración que ya se haya ejecutado no tendrá efecto al ejecutar db:migrate) Al migrar hacia abajo, se desharán todas las versiones encontradas en schema_migrations que sean mayores que la versión a la que está regresando.

+2

Gracias a Dios esta respuesta presentó más detalles para mí. ¿Por qué no hay schema_migrations en ninguna parte de la documentación de db: migrate? ¡Era la pieza que faltaba para mi comprensión del sistema con respecto a cómo pasaban los rieles para "determinar qué migraciones deberían ejecutarse"! –

5

Una migración significa que pasa de la versión actual a una versión más nueva (como se dice en la primera respuesta). Usando rake db: migrate puede aplicar cualquier cambio nuevo a su esquema. Pero si desea retroceder a una migración anterior, puede usar rake db: rollback para anular sus nuevos cambios si están incorrectamente definidos. Precaución: al hacerlo, sus datos se perderán.

Cuestiones relacionadas