C'è un modo semplice per eseguire una singola migrazione? Non voglio migrare a una determinata versione, voglio solo eseguirne una specifica.
C'è un modo semplice per eseguire una singola migrazione? Non voglio migrare a una determinata versione, voglio solo eseguirne una specifica.
Risposte:
Puoi semplicemente eseguire il codice direttamente dal file ruby:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Nota: potrebbero essere necessarie versioni più recenti di binari AddFoos.new.up
anziché AddFoos.up
.
Un modo alternativo (senza IRB) che si basa sul fatto che richiedono restituisce una matrice di nomi di classe:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Nota che se lo fai, probabilmente non aggiornerà la schema_migrations
tabella, ma sembra che sia quello che vuoi comunque.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
quindiAddFoos.new.up
change
invece di up
e down
, dovrai eseguireAddFoos.new.migrate(:up)
AddFoos.new.change
Supponendo che una versione abbastanza recente di Rails sia sempre possibile eseguire:
rake db:migrate:up VERSION=20090408054532
Dove versione è la data / ora nel nome file della migrazione.
Modifica: ad un certo punto negli ultimi 8 anni (non sono sicuro di quale versione) Rails ha aggiunto controlli che ne impediscono l'esecuzione se è già stata eseguita. Ciò è indicato da una voce nella schema_migrations
tabella. Per rieseguirlo, esegui semplicemente rake db:migrate:redo VERSION=20090408054532
invece.
rake db:migrate:down VERSION=XXX
Se vuoi eseguire una migrazione specifica , fallo
$ rake db:migrate:up VERSION=20080906120000
Se si desidera eseguire più migrazioni , farlo
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Se vuoi eseguire una singola migrazione più volte, fallo
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(puoi trovare il numero di versione nel nome file della tua migrazione)
Modifica: puoi anche semplicemente rinominare il tuo file di migrazione, ad esempio:
20151013131830_my_migration.rb
-> 20151013131831_my_migration.rb
Quindi migrare normalmente, questo tratterà la migrazione come nuova (utile se si desidera migrare su un ambiente remoto (come la gestione temporanea) su cui si ha meno controllo.
Modifica 2 : è anche possibile aggiungere una nuke alla voce di migrazione nel database. Per esempio:
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migrate
eseguirà quindi nuovamente il up
metodo delle migrazioni sfocate.
Se hai implementato un change
metodo come questo:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
È possibile creare un'istanza della migrazione ed eseguirla migrate(:up)
o migrate(:down)
su un'istanza, in questo modo:
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
up
e down
.
Questi sono i passaggi per eseguire nuovamente questo file di migrazione "20150927161307_create_users.rb"
Copia e incolla la classe che si trova in quel file sulla console.
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 un'istanza della classe CreateUsers
:c1 = CreateUsers.new
change
di tale istanza:c1.change
require "./db/migrate/20150927161307_create_users.rb"
invece di copiare e incollare. È quindi possibile eseguire la classe allo stesso modo creando un'istanza e chiamando il metodo definito nella classe CreateUsers.new.change
.
A partire da rails 5
te puoi anche usare rails
invece dirake
Rotaie 3 - 4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Rotaie 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
rails db:migrate VERSION=20160920130051
Se hai problemi con i percorsi che puoi usare
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Si noti che invece di script/runner
, potrebbe essere necessario utilizzare rails runner
su nuovi ambienti rotaie.
Se vuoi eseguirlo dalla console, questo è quello che stai cercando:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
Ho provato le altre risposte, ma richiedendo senza Rails.root
di me non ha funzionato.
Inoltre, .migrate(:up)
parte impone di rieseguire la migrazione indipendentemente dal fatto che sia già stata eseguita o meno. Questo è utile per quando hai già eseguito una migrazione, l'hai annullata un po 'scherzando con il db e vuoi una soluzione rapida per riaverla.
Sembra almeno nell'ultima versione di Rails (5.2 al momento in cui scrivo) c'è un altro modo per filtrare le migrazioni in esecuzione. È possibile passare un filtro in una SCOPE
variabile d'ambiente che verrebbe quindi utilizzato per selezionare i file di migrazione.
Supponendo di avere due file di migrazione 1_add_foos.rb
e in 2_add_foos.run_this_one.rb
esecuzione
SCOPE=run_this_one rails db:migrate:up
selezionerà ed eseguirà solo 2_add_foos.run_this_one.rb
. Tenere presente che verranno eseguiti tutti i file di migrazione corrispondenti all'ambito.