¿Hay una manera fácil de ejecutar una única migración? No quiero migrar a una versión determinada, solo quiero ejecutar una específica.
¿Hay una manera fácil de ejecutar una única migración? No quiero migrar a una versión determinada, solo quiero ejecutar una específica.
Respuestas:
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 nuevas de rieles pueden requerir en AddFoos.new.up
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 schema_migrations
tabla, pero parece que eso es lo que quiere de todos modos.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
entoncesAddFoos.new.up
change
lugar de up
y down
, deberá ejecutarAddFoos.new.migrate(:up)
AddFoos.new.change
Suponiendo una versión bastante reciente de Rails, siempre 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 schema_migrations
tabla. Para volver a ejecutarlo, simplemente ejecute en su rake db:migrate:redo VERSION=20090408054532
lugar.
rake db:migrate:down VERSION=XXX
Si desea ejecutar una migración específica , haga
$ rake db:migrate:up VERSION=20080906120000
Si desea ejecutar migraciones varias veces , haga
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Si desea ejecutar una sola migración varias 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 migre normalmente, esto tratará la migración como una nueva (útil si desea migrar en un entorno remoto (como la puesta en escena) en el que tiene menos control.
Edición 2 : también puede eliminar la entrada de migración en la base de datos. P.ej:
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 up
método de las migraciones nucleadas.
Si ha implementado un change
método 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 ejecutarla migrate(:up)
o migrate(:down)
en una instancia, como esta:
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
up
y down
.
Estos son los pasos para volver a ejecutar este archivo de migración "20150927161307_create_users.rb"
Copie y pegue la clase que está en ese archivo en 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
Crea una instancia de la clase CreateUsers
:c1 = CreateUsers.new
change
de esa instancia:c1.change
require "./db/migrate/20150927161307_create_users.rb"
lugar de copiar y pegar. Luego puede ejecutar la clase de la misma manera instanciando y llamando al método definido en la clase CreateUsers.new.change
.
A partir de rails 5
usted también puede usar en rails
lugar derake
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
rails db:migrate VERSION=20160920130051
Si tienes problemas con los caminos, puedes usar
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Tenga en cuenta que, en lugar de hacerlo script/runner
, es posible que deba usarlo rails runner
en entornos de rieles nuevos.
Si desea ejecutarlo desde la consola, esto es lo que está buscando:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
Intenté las otras respuestas, pero requerirlo sin Rails.root
que me funcionase.
Además, .migrate(:up)
parte obliga a que la migración se vuelva a ejecutar independientemente de si ya se ha ejecutado o no. Esto es útil para cuando ya ejecutó una migración, la ha deshecho un poco jugando con la base de datos y desea una solución rápida para volverla a ejecutar.
Parece que al menos en la última versión de Rails (5.2 en el momento de la escritura) hay una forma más de filtrar las migraciones que se ejecutan. Se puede pasar un filtro en una SCOPE
variable de entorno que luego se usaría para seleccionar archivos de migración.
Suponiendo que tiene dos archivos de migración 1_add_foos.rb
y en 2_add_foos.run_this_one.rb
ejecución
SCOPE=run_this_one rails db:migrate:up
seleccionará y solo se ejecutará 2_add_foos.run_this_one.rb
. Tenga en cuenta que se ejecutarán todos los archivos de migración que coincidan con el alcance.