Haz una sola migración


94

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 o después. Gracias.


1
Esto sería disponen de carriles convenientes: añadir un STEP=nargumento para db:migrate(donde nes el número de migraciones a plazo, al igual que lo hay para db:rollback) - entonces usted podría hacer rake db:migrate STEP=1o rake db:migrate STEP=2, etc
user664833

Respuestas:


164

rake db:migrate:redo VERSION=xxxxxxx, pero eso ejecutará el downy luego el uppaso. Puede hacer esto junto con comentar el paso hacia abajo temporalmente.


Hmm, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo no parece tener un argumento VERSION.
Terry G Lorber

3
@pedrorolo: Esto no está desactualizado. Esta tarea no tiene descripción y, por lo tanto, no aparecerá en rake -T.
Ryan Bigg

1
@pedrorolo: db:test:preparetampoco aparece en esa lista. Dios, llego tarde a la fiesta.
mraaroncruz

9
Para ampliar lo que dice Ryan, si la tabla se ha eliminado de la base de datos fuera de Rails, es rake db:migrate:up VERSION=my_versionposible que no haga nada , porque la tabla schema_migrations todavía dice que se ha ejecutado. En la misma situación rake db:migrate:redo VERSION=my_versionpuede fallar porque no se puede soltar la mesa. En este caso, comente el downmétodo en la migración temporalmente y vuelva a ejecutarrake db:migrate:redo...
Leo

3
Y para expandir lo que dice @Leo, si la migración se define con def change, cámbiela a def self.up además de lo anterior.
valk

70
rake db:migrate:up VERSION=1234567890

de manera similar rake db:migrate:downpara eliminar una migración específica. Puede obtener una lista de tareas de rake disponibles con rake -T.


4
El VERSIONmencionado 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,.
aaron-coding

3
Las versiones se muestran muy bien con rake db:
migrate

Es digno de mención, VERSIONes solo una variable de entorno, por lo que puede aparecer primero en el comando o incluso establecerse antes del comando:VERSION=1234567890 rake db:migrate:up
Joshua Pinter

25

Tuve que ejecutar una única migración que cambió y necesitaba volver a ejecutarse independientemente de todas las demás migraciones. Enciende la consola y haz esto:

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

Más útilmente, esto podría ponerse en una tarea de rastrillo, etc.


6
Esto funcionó de maravilla. También puede simplemente 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 en su YourMigrations.migrate(:up)lugar (¡o :downtambién!)
trisweb

1
puede que tenga que hacerlorequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

15

rake db:migrate:up VERSION=version_no

Migrará (agregará) un script de migración específico

rake db:migrate:down VERSION=version_no

Eliminará un script de migración específico


10
rake db:migrate VERSION=20098252345

pruébalo.


7
Creo que esto ejecutará cualquier migración hasta la que especificó.
Ken Liu

1
close, pero que también ejecuta cualquier migración antes de la migración específica.
Anon

6
No creo que debas / quieras ejecutar solo una migración sin considerar las anteriores. Una migración es una representación de la estructura de la base de datos en lo que respecta al código en un momento dado 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 ascendentes / descendentes adecuadas para mantener las migraciones funcionales ... es un mal hábito escribir solo sus migraciones ascendentes.
JP Silvashy

1
Notable: VERSIONes solo una variable de entorno, por lo que puede aparecer primero en el comando o incluso establecerse antes del comando:VERSION=20098252345 rake db:migrate
Joshua Pinter

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

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

Puede comprobar las marcas de tiempo (ID de migración) de las migraciones anteriores que ha realizado utilizando

rake db:migrate:status    

3

Ampliar la respuesta de korch anterior requireno funcionó para mí, pero lo loadhizo. Para ser concreto, 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 escribiendo

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

trabajó para mi.

    > Race.new.min_quantity # => 0 

Esto fue para ruby ​​1.9.3p484 (2013-11-22 revisión 43786) [x86_64-linux] y Rails 3.2.13.


2

Agregando mis 2 ¢ a esto porque me encontré con el mismo problema:

Si absolutamente desea ejecutar una migración nuevamente sin crear una nueva, puede hacer lo siguiente:

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

Y rails "olvidará" que ejecutó la migración para 20150105181157. Ahora, cuando ejecute db: migrate, lo ejecutará de nuevo.

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


1

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. Utilizar:

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

¿Copiar y pegar su código en la migración al script / consola?



0

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

Esto es 100% pirateado y definitivamente no recomendaría hacerlo en producción, pero funcionará:

  1. Mueva la migración que desea volver a ejecutar fuera de su directorio a un lugar temporal
  2. Genera otra migración con el mismo nombre
  3. Copie / pegue el código de migración original en el archivo de migración recién generado
  4. Ejecute la nueva migración
  5. Eliminar el archivo de migración recién generado
  6. Edite sus migraciones de esquema para eliminar el valor más reciente
  7. Restaurar el archivo de migración anterior
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.