Ejecutar un único archivo de migración


Hay una manera fácil de ejecutar una migración? No quiero migrar a una versión determinada, solo quiero ejecutar una específica.

Author: nan, 2009-04-16

10 answers

Puede ejecutar el código directamente desde el archivo ruby:

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

Nota: las versiones más recientes de rails pueden requerir AddFoos.new.up en lugar de AddFoos.up.

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

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

Tenga en cuenta que si hace esto, probablemente no actualizará la tabla schema_migrations, pero parece que eso es lo que desea de todos modos.

 210
Author: Orion Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-04 23:18:23

Asumiendo una versión bastante reciente de Rails siempre se puede ejecutar:

rake db:migrate:up VERSION=20090408054532

Donde version es la marca de tiempo en el nombre de archivo de la migración.

Editar: En algún momento de los últimos 8 años (no estoy seguro de qué versión) Rails agregó comprobaciones que impiden que esto se ejecute si ya se ha ejecutado. Esto se indica mediante una entrada en el cuadro schema_migrations. Para volver a ejecutarlo, simplemente ejecute rake db:migrate:redo VERSION=20090408054532 en su lugar.

 355
Author: gtd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-30 15:23:28

Si desea ejecutar una migración específica, do

$ rake db:migrate:up VERSION=20080906120000

Si desea ejecutar migraciones varias veces, do

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

Si desea ejecutar una migración única múltiple veces, haga

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

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


Editar: También puede simplemente cambiar el nombre de su archivo de migración, Por ejemplo:

20151013131830_my_migration.rb -> 20151013131831_my_migration.rb

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

Edit 2: También puede simplemente eliminar la entrada de migración en la base de datos. Eg:

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

rake db:migrate luego volverá a ejecutar el método up de las migraciones nuked.

 94
Author: Benjamin Crouzier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-02 10:07:32

Si has implementado un método change como este:

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) o migrate(:down) en una instancia, así:

$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
 24
Author: chibicode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-24 21:20:16

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

  1. Ejecute el modo de consola. (carriles 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. Ejecute el método change de esa instancia: c1.change
 15
Author: rolph dzounga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-28 02:55:25

Si tienes problemas con los caminos puedes usar

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
 11
Author: Dejan Cancarevic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-23 10:18:26

A partir de rails 5 también puedes usar rails en lugar de rake

Rieles 3 - 4

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

Carriles 5

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

# or

rails db:migrate:up VERSION=20160920130051
 11
Author: Deepak Mahakale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-23 17:33:16

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

 5
Author: viniciusnz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-26 02:27:52

Método 1:

rake db:migrate:up VERSION=20080906120000

Método 2:

En La Consola Rails 1. Copie y pegue la clase de migración en la consola (diga add_name_to_user.po) 2. A continuación, en la consola, escriba lo siguiente

Sharding.run_on_all_shards{AddNameToUser.up}

¡está hecho!!

 5
Author: ramya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-26 08:41:55

Parece que al menos en la última versión de Rails (5.2 en el momento de escribir esto) hay una forma más de filtrar las migraciones que se están ejecutando. Se puede pasar un filtro en una variable de entorno SCOPE que luego se usaría para seleccionar los archivos de migración.

Suponiendo que tiene dos archivos de migración 1_add_foos.rb y 2_add_foos.run_this_one.rb en ejecución

SCOPE=run_this_one rails db:migrate:up

Seleccionará y ejecutará solo 2_add_foos.run_this_one.rb. Tenga en cuenta que se ejecutarán todos los archivos de migración que coincidan con el ámbito.

 1
Author: szymek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-10 07:57:45