2009-04-15 12 views

Respuesta

199

Usted sólo puede ejecutar el código directamente fuera del archivo de rubí:

rails console 
>> require "db/migrate/20090408054532_add_foos.rb" 
>> AddFoos.up 

Nota: las nuevas versiones de los carriles pueden requerir AddFoos.new.up en lugar de AddFoos.up.

Una forma alternativa (sin IRB) que se basa en el hecho de que requiere devuelve una matriz de nombres de clase:

script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up' 

Tenga en cuenta que si lo hace, es probable que no actualiza la tabla schema_migrations, pero parece que eso es lo que quieres de todos modos.

+0

Perfecto. Justo lo que necesitaba. – nan

+45

A veces necesita un './' delante de la ruta requerida, y definitivamente no actualiza los schema_migrations. – Bearddo

+1

'script/runner 'require (" db/migrate/20090408054532_add_foos.rb "). First.constantize.up'' Esto parece un buen truco. Pero 'require' ahora devuelve verdadero o falso. ¿Hay alguna solución? – Siddhant

0

¿Es esto algo que ejecutó una vez como una migración porque resultó ser necesario, y luego resulta ser una consulta útil que podría necesitar ejecutarse varias veces?

quizás debería refactorizar el contenido de la migración en un modelo u otro objeto, luego tener la referencia de migración en esa nueva ubicación.

Luego puede simplemente ejecutar el nuevo objeto en sus lesiones invocando ruby ​​en la línea de comando.

317

Suponiendo versión bastante reciente de rieles siempre se puede ejecutar:

rake db:migrate:up VERSION=20090408054532 

donde versión es la marca de tiempo en el nombre de archivo de la migración.

Editar: En algún momento durante los últimos 8 años (no estoy seguro de qué versión) Rails agregó controles que impiden que esto se ejecute si ya se ha ejecutado. Esto se indica mediante una entrada en la tabla schema_migrations. Para volver a ejecutarlo, simplemente elimine esa fila y luego esto funcionará.

+0

Esto ejecutará migraciones hasta esa versión. Estaba buscando una forma de ejecutar solo una migración específica. – nan

+109

En realidad, el comando es rake db: migrate: redo VERSIÓN = my_version –

+2

@Chirag Patel: ¡Eso es exactamente lo que estaba buscando! ¡Gracias! – Abel

4

Tenga en cuenta que en lugar de script/runner, puede que tenga que usar rails runner en entornos de nuevos rieles.

85

Si desea run a specific migration, hacer

$ rake db:migrate:up VERSION=20080906120000 

Si desea ejecutar migraciones multiple times, hacer

# use the STEP parameter if you need to go more than one version back 
$ rake db:migrate:redo STEP=3 

Si desea ejecutar un sola migración múltiples veces, hacer

# this is super useful 
$ rake db:migrate:redo VERSION=20080906120000 

(puede encontrar el número de versión en el nombre del archivo de migración)


Editar: También puede simplemente cambiar el nombre del archivo de migración, Ej:

20151013131830_my_migration.rb ->20151013131831_my_migration.rb

A continuación, migre normalmente, esto tratará la migración como una nueva (útil si desea migrar en un entorno remoto (como la etapa) en el que tiene menos control.

Editar 2: También puede simplemente activar la entrada de migración en la base de datos. Ej:

rails_c> q = "delete from schema_migrations where version = '20151013131830'" 
rails_c> ActiveRecord::Base.connection.execute(q) 

rake db:migrate se vuelva a ejecutar el método de las migraciones nuked up.

+0

Tanto "arriba" como "rehacer" no funcionaron para mí, pero borrar la fila en schema_migrations fue perfecto. – cesoid

22

Si ha implementado un método change así:

class AddPartNumberToProducts < ActiveRecord::Migration 
    def change 
    add_column :products, :part_number, :string 
    end 
end 

Puede crear una instancia de la migración y ejecutar migrate(:up)migrate(:down) o en una instancia, como esto:

$ rails console 
>> require "db/migrate/20090408054532_add_part_number_to_products.rb" 
>> AddPartNumberToProducts.new.migrate(:down) 
+0

Esto también se aplica incluso si está usando 'up' y' down'. –

10

Si tiene problemas con las rutas que puede usar

require Rails.root + 'db/migrate/20090408054532_add_foos.rb' 
4

Método 1:

rake db:migrate:up VERSION=20080906120000 

Método 2:

En Rails consola 1. Copiar la clase de migración en la consola (por ejemplo add_name_to_user.rb) 2. Luego, en la consola, escriba lo siguiente

Sharding.run_on_all_shards{AddNameToUser.up} 

¡Ya está!

13

Estos son los pasos para ejecutar de nuevo este archivo de migración "20150927161307_create_users.rb"

  1. Ejecutar el modo de consola. (rails c)
  2. Copie y pase la clase que está en ese archivo a la consola.

    class CreateUsers < ActiveRecord::Migration 
        def change 
        create_table :users do |t| 
         t.string :name 
         t.string :email 
         t.timestamps null: false end 
        end 
        end 
    end 
    
  3. Crear una instancia de la clase CreateUsers: c1 = CreateUsers.new

  4. ejecutar el método change de esa instancia: c1.change
+0

¡Esto es realmente bueno para mí en Rails4.1.7! –

+0

Realmente ingenioso, también funciona para mí en Rails 5. – DemitryT

8

A partir de rails 5 también se puede utilizar rails en lugar de rake

Rieles 3 - 4

# < rails-5.0 
rake db:migrate:up VERSION=20160920130051 

rieles 5

# >= rails-5.0 
rake db:migrate:up VERSION=20160920130051 

# or 

rails db:migrate:up VERSION=20160920130051 
+1

también adivina lo que necesitas con 'rieles db: migrate VERSION = 20160920130051' – frenesim

Cuestiones relacionadas