2009-08-25 16 views
73

Estoy tratando de ejecutar solo una migración de un montón en mi aplicación Rails. ¿Cómo puedo hacer esto? No quiero ejecutar ninguna de las migraciones antes ni después de ella. Gracias.Rake solo una migración

+0

Esta sería una práctica función de rieles: añadir un 'n' PASO = argumento a' db: migrate '(donde' n' es el número de migraciones para ejecutar, al igual que para 'db: rollback') - entonces podría hacer' rake db: migrate STEP = 1' o 'rake db: migrate STEP = 2', etc. – user664833

Respuesta

141

rake db:migrate:redo VERSION=xxxxxxx, pero eso ejecutará el down y luego el paso up. Podrías hacer esto junto con comentar temporalmente el paso hacia abajo.

+0

Hmm, http://blog.stonean.com/2007/12/18/rake-dbmigrateredo/, :: rehacer no parece tomar un argumento VERSIÓN. –

+0

Funciona, lo probé. Tenga en cuenta que el artículo es de DOS MIL Y SIETE. Rails cambia mucho durante ese tiempo. –

+0

Entonces, ¿por qué Stackoverflow debería mostrar información desactualizada? Si ahora ejecuta 'rake -T' no hay ninguna tarea llamada' db: migrate: redo' –

7
rake db:migrate VERSION=20098252345 

dale una oportunidad.

+6

Creo que esto ejecutará cualquier migración hasta la que haya especificado. –

+1

cerrar, pero eso también ejecuta cualquier migración antes de la migración específica. – Anon

+4

No creo que deba/desee ejecutar solo una migración sin considerar las anteriores. Una migración es una representación de la estructura de las bases de datos en lo que se refiere al código en un punto dado en el tiempo, y por lo tanto las migraciones antes de que sean necesarias. Si solo desea ejecutar _una_ migración, es probable que no haya escrito las operaciones correctas arriba/abajo para mantener las migraciones funcionales ... es una mala costumbre escribir solo sus migraciones ascendentes. –

0

Tiene que haber una forma de ejecutar la clase de migración a través de la consola. Parece que no consigo que el código de migraciones sea reconocible.

Sin embargo, como indican los comentarios, se prefiere ejecutar las migraciones en orden. Use:

rake db:migrate VERSION=########## 

Copie y pegue su código en la migración a la secuencia de comandos/consola?

57
rake db:migrate:up VERSION=1234567890 

de manera similar rake db:migrate:down para tomar una migración específica hacia abajo. Puede obtener una lista de tareas de rake disponibles con rake -T.

+3

La 'VERSIÓN 'mencionada aquí es el valor entero al comienzo de cada uno de sus archivos de migración (que es solo la marca de tiempo de cuando se creó). Por ejemplo, 'VERSION = 20150720023630'. –

+1

Las versiones se muestran muy bien con rake db: migrate: estado – jpgeek

23

He tenido que ejecutar una única migración que cambió y debe volver a ejecutarse independientemente de todas las demás migraciones. Enciende la consola y hacer esto:

>> require 'db/migrate/your_migrations.rb' 
=> ["YourMigrations"] 
>> YourMigrations.up 
=> etc... as the migration runs 
>> YourMigration.down 

Más útil esta podría ser puesto en una tarea rake etc.

+6

Esto funcionó de maravilla. También puede copiar y pegar el código de la migración en la consola para definir la clase (y esto permite la manipulación manual si es necesario, si acaba de cometer un error en Dev, por ejemplo). Si definió una migración reversible con 'change', ejecute' YourMigrations.migrate (: up) 'en su lugar (o': down' también!) – trisweb

+0

, puede que tenga que 'require' # {Rails.root}/db/migrate/your_migrations.rb "' – s2t2

6

rake db:migrate:up VERSION=version_no

migrará (ADD) script de migración específica

rake db:migrate:down VERSION=version_no

eliminará script de migración específica

3

Ampliando la respuesta por Korch anterior, require hicieron no funciona para mí, pero load hizo. Para ser concretos, para el archivo de migración:

class ChangeMinQuantityToRaces < ActiveRecord::Migration 
     def change 
     change_column :races, :min_quantity, :integer, :default => 0 
     end 
    end 

en la consola tecleando

> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb' 
    > ChangeMinQuantityToRaces.new.change 

trabajó para mí.

> Race.new.min_quantity # => 0 

Esto era para rubí 1.9.3p484 (22/11/2013 revisión 43786) [x86_64-linux] y rieles 3.2.13.

+0

¡Brillante, esto funciona sin problemas! – Loed

3
rake db:migrate:redo version='xxxx' 

Recuerde poner las comillas alrededor de xxxx, xxxx es la marca de tiempo (o migración ID) para su migración.

Es posible comprobar las marcas de tiempo (Migración ID) para las migraciones anteriores que has hecho mediante el uso de

rake db:migrate:status  
1

Adición de mis 2 ¢ a esto porque me encontré con este mismo tema:

Si absolutamente desee ejecutar una migración de nuevo sin crear uno nuevo, puede hacer lo siguiente:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

y los carriles se " olvide "que ejecutó la migración para 20150105181157. Ahora cuando ejecuta db: migrate lo ejecutará nuevamente.

Sin embargo, esto siempre es una mala idea. La única instancia en la que podría tener sentido es si tiene una rama de desarrollo y todavía no ha desarrollado su migración y desea agregarle algunas cosas en el desarrollo. Pero incluso así, es mejor realizar su migración en dos direcciones para que pueda retroceder adecuadamente y volver a intentarlo repetidamente.

0

Uso esta técnica en desarrollo cuando cambio una migración en una cantidad significativa, y no quiero migrar mucho y perder datos en el camino (especialmente cuando estoy importando datos heredados que toman un largo tiempo que no quiero tener que volver a importar de nuevo).

Esto es 100% hacker y definitivamente no recomendaría hacer esto en la producción, pero lo hará el truco:

    migración
  1. movimiento que desea volver a ejecutar fuera de su directorio a un lugar temporal
  2. Generar otra migración con el mismo nombre
  3. Copia/pega el siguiente código de migración original en el archivo de migración recién generado
  4. Ejecutar la nueva migración
  5. Eliminar la nueva ge archivo de migración nerated
  6. Editar sus migraciones de esquema para eliminar el valor más reciente
  7. restaurar el antiguo archivo de migración
Cuestiones relacionadas