2010-07-27 13 views
40

En lo que me refiero "reajuste" en el diccionario, en lugar de definición git ...Rieles rebase las migraciones en un proyecto de larga duración

Tengo un proyecto Rails grande, larga duración que tiene cerca de 250 migraciones, se está haciendo un toque difícil de manejar para todos estos.

Dicho esto, necesito una base desde la cual purgar y reconstruir mi base de datos cuando se ejecutan las pruebas. Entonces, los datos contenidos en estos son importantes.

¿Alguien tiene alguna estrategia para decir, volcar el esquema en un punto establecido? Archivar todas las migraciones anteriores y comenzar de nuevo con nuevas migraciones.

Obviamente puedo usar el esquema de rake: volcado, pero realmente necesito una forma en que db: migrate cargue el esquema primero y luego comience a ejecutar el resto de las migraciones.

Me gustaría seguir utilizando las migraciones, ya que son muy útiles en el desarrollo, sin embargo, no hay forma de que regrese y edite una migración desde 2007, por lo que parece una tontería guardarla.

Respuesta

46

En general, no necesita limpiar las migraciones anteriores. Si está ejecutando db: migrar desde cero (sin db existente), Rails usa db/schema.rb para crear las tablas en lugar de ejecutar cada migración. De lo contrario, solo ejecuta las migraciones necesarias para actualizar del esquema actual a la más reciente.

Si aún desea combinar las migraciones hasta un punto en uno solo dado, usted podría tratar de:

  • migran desde cero hasta el esquema que se hayan empleado rake db:migrate VERSION=xxx
  • volcar el esquema utilizando rake db:schema:dump
  • elimina las migraciones desde el principio hasta la versión xxx y crea una nueva migración usando los contenidos de db/schema.rb (coloca las instrucciones create_table y add_index en el método self.up de la nueva migración).

Asegúrese de elegir uno de los números de versión de migración anteriores para su nueva migración agregada; de lo contrario, Rails trataría de aplicar esa migración en su servidor de producción (lo que borraría sus datos existentes, ya que las sentencias create_table usan: force⇒true).

De todos modos, no recomendaría hacer esto ya que Rails generalmente maneja bien las migraciones. Pero si aún así lo desea, asegúrese de verificar todo dos veces y probarlo localmente antes de arriesgarse a la pérdida de datos en su servidor de producción.

+3

Te das cuenta de t ¿Esto solo funciona si no hay datos agregados en tus migraciones? schema.rb no almacena ningún dato creado durante una migración. – weexpectedTHIS

+4

@weexpectedTHIS por lo que no debería estar tocando datos en migraciones. – Scottymeuk

+0

@scottymeuk, ¿cómo propone implementar un cambio en los datos – weexpectedTHIS

1

Además de la respuesta proporcionada (que indica cómo consolidar su volumen de migraciones), indica una preocupación por depurar datos (que supongo que se agrega manualmente después de que los dispositivos completan sus tablas); que infiere que depende de actualizar un estado de datos inicial. Algunos proyectos requieren un refinamiento intensivo de los datos base, la reconstrucción y la repoblación de las tablas. La nuestra depende en gran medida de la ejecución repetitiva de estas operaciones, y he descubierto que si puede reducir su esquema completamente a sentencias SQL, sus tablas se reconstruirán mucho más rápido de lo que lo harán con la sintaxis de Ruby.

Una ayuda más trivial en la reconstrucción de las tablas es dedicar una ventana de terminal separada a una sola instrucción de comando combinado:

rake db: caída db: crear db: schema: db carga: accesorios: Carga

Cada vez que necesite reconstruir y volver a poblar sus tablas, una pulsación de flecha hacia arriba y de retorno volverá a realizar ese trabajo de rutina. Si no hay conflicto en las instrucciones de ejecución de SQL, y si no tiene más migraciones para ejecutar mientras su proyecto está en estado de desarrollo, las sentencias de SQL se ejecutarán tal vez mejor que dos veces más rápido que la sintaxis de Ruby. Nuestras tablas se reconstruyen y vuelven a poblar en 20 segundos de esta manera, por ejemplo, mientras que la sintaxis de Ruby aumenta el proceso a más de 50 segundos. Si está esperando que los datos se actualicen para realizar más trabajos (especialmente muchas veces), esto hace una gran diferencia en el flujo de trabajo.

3

para automatizar la fusión (o aplastamiento) de las migraciones, se podría utilizar el Squasher gem

Simplemente instale

gem install squasher 

y correr con una fecha, y las migraciones antes de esa fecha se fusionará:

squasher 2016 # => Will merge all migration created before 2016 

Más detalles in the README

Cuestiones relacionadas