Esiste un modo semplice per eseguire una singola migrazione? Non voglio migrare ad una certa versione, voglio solo eseguirne uno specifico.Eseguire un singolo file di migrazione
risposta
Si può solo eseguire il codice direttamente dal file di ruby:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Nota: le versioni più recenti di rotaie possono richiedere AddFoos.new.up
piuttosto che AddFoos.up
.
Un modo alternativo (senza IRB), che si basa sul fatto che richiedono restituisce un array di nomi di classi:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Si noti che se si esegue questa operazione, probabilmente non aggiornare la tabella schema_migrations
, ma sembra che sia quello che vuoi comunque.
È qualcosa che è stato eseguito una volta come una migrazione perché era necessario, quindi risulta essere una query utile che potrebbe essere necessario eseguire più volte?
forse si dovrebbe refactoring il contenuto della migrazione in un modello o altro oggetto, quindi fare riferimento alla migrazione che nuova posizione.
Quindi è possibile eseguire semplicemente il nuovo oggetto a livello di lesura invocando ruby sulla riga di comando.
Supponendo versione abbastanza recente di Rails è sempre possibile eseguire:
rake db:migrate:up VERSION=20090408054532
Dove versione è il timestamp nel nome del 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à stato eseguito. Ciò è indicato da una voce nella tabella schema_migrations
. Per rieseguire, basta cancellare quella riga e quindi funzionerà.
Si prega di notare che invece di script/runner
, potrebbe essere necessario utilizzare rails runner
su nuovi ambienti rotaie.
Se si vuole run a specific migration, fare
$ rake db:migrate:up VERSION=20080906120000
Se si desidera eseguire migrazioni multiple times, fare
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Se si desidera eseguire un singolo migrazione multipla volte, fare
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(potete trovare il numero di versione nel nome del file della migrazione)
Edit: Si può anche semplicemente rinominare il file di migrazione, ad esempio:
20151013131830_my_migration.rb
->20151013131831_my_migration.rb
Quindi migrare normalmente, questo tratterà la migrazione come una nuova (utile se si vuole migrare su un ambiente remoto (come la gestione temporanea) su cui si ha meno controllo.
Modifica 2: È anche possibile eseguire il nuke della voce di migrazione nel database. Ad esempio:
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migrate
sarà quindi eseguire nuovamente il metodo delle migrazioni nuked up
.
Sia "up" che "redo" non hanno funzionato per me, ma l'eliminazione della riga in schema_migrations era perfetta. – cesoid
Se hai implementato un metodo change
come questo:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
È possibile creare un'istanza della migrazione ed eseguire 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)
Questo vale anche se stai usando 'up' e' down'. –
Se hai problemi con i percorsi che puoi utilizzare
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Metodo 1:
rake db:migrate:up VERSION=20080906120000
Metodo 2:
In Rails Console 1. Copiare Inserire la classe di migrazione in consolle (diciamo add_name_to_user.rb) 2. Quindi in console, digitare il seguente
Sharding.run_on_all_shards{AddNameToUser.up}
È fatto !!
Questo sono i passaggi per eseguire di nuovo il file di migrazione "20150927161307_create_users.rb"
- Eseguire il modalità console. (binari c)
Copia e incolla la classe che si trova in quel file nella 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
Creare un'istanza della classe
CreateUsers
:c1 = CreateUsers.new
- eseguire il metodo
change
di tale istanza:c1.change
Questo è davvero buono per me in Rails4.1.7! –
Davvero elegante, funziona anche per me su Rails 5. – DemitryT
Come di rails 5
si può anche utilizzare rails
invece di rake
Rotaie 3 - 4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Rails 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
indovina anche quello che ti serve con 'rails db: migrate VERSION = 20160920130051' – frenesim
Perfetto. Proprio quello di cui avevo bisogno. – nan
A volte è necessario un './' di fronte al percorso require, e sicuramente non aggiorna lo schema_migrations. – Bearddo
'script/runner 'require (" db/migrate/20090408054532_add_foos.rb "). First.constantize.up'' Questo sembra un bel trucco. Ma 'require' ora ritorna vero o falso. C'è una soluzione? – Siddhant