2009-04-15 11 views

risposta

199

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.

+0

Perfetto. Proprio quello di cui avevo bisogno. – nan

+45

A volte è necessario un './' di fronte al percorso require, e sicuramente non aggiorna lo schema_migrations. – Bearddo

+1

'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

0

È 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.

317

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à.

+0

Questo farà eseguire migrazioni fino a quella versione. Stavo cercando un modo per eseguire solo una migrazione specifica. – nan

+109

In realtà il comando è rake db: migrate: redo VERSION = my_version –

+2

@Chirag Patel: Questo è esattamente quello che stavo cercando! Grazie! – Abel

4

Si prega di notare che invece di script/runner, potrebbe essere necessario utilizzare rails runner su nuovi ambienti rotaie.

85

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.

+0

Sia "up" che "redo" non hanno funzionato per me, ma l'eliminazione della riga in schema_migrations era perfetta. – cesoid

22

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) 
+0

Questo vale anche se stai usando 'up' e' down'. –

10

Se hai problemi con i percorsi che puoi utilizzare

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

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 !!

13

Questo sono i passaggi per eseguire di nuovo il file di migrazione "20150927161307_create_users.rb"

  1. Eseguire il modalità console. (binari c)
  2. 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 
    
  3. Creare un'istanza della classe CreateUsers: c1 = CreateUsers.new

  4. eseguire il metodo change di tale istanza: c1.change
+0

Questo è davvero buono per me in Rails4.1.7! –

+0

Davvero elegante, funziona anche per me su Rails 5. – DemitryT

8

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 
+1

indovina anche quello che ti serve con 'rails db: migrate VERSION = 20160920130051' – frenesim

Problemi correlati