Risposte:
rake db:migrate:redo VERSION=xxxxxxx
, ma verrà eseguito il passaggio down
e quindi il up
passaggio. Puoi farlo insieme a commentare temporaneamente il passaggio in basso.
rake -T
.
db:test:prepare
inoltre non compare in quella lista. Dio, sono in ritardo alla festa.
rake db:migrate:up VERSION=my_version
potrebbe non fare nulla , perché la tabella schema_migrations dice ancora che è stata eseguita. Nella stessa situazione rake db:migrate:redo VERSION=my_version
potrebbe non riuscire perché non può cadere la tabella. In questo caso, commenta down
temporaneamente il metodo nella migrazione e rieseguirake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
allo stesso modo rake db:migrate:down
per eliminare una migrazione specifica. Puoi ottenere un elenco delle attività di rake disponibili con rake -T
.
VERSION
menzionato qui è il valore intero all'inizio di ciascuno dei tuoi file di migrazione (che è solo il timestamp di quando è stato creato). Ad esempio VERSION=20150720023630
,.
VERSION
è solo una variabile d'ambiente, quindi può essere la prima nel comando o addirittura impostata prima del comando:VERSION=1234567890 rake db:migrate:up
Ho dovuto eseguire una singola migrazione che è cambiata e doveva essere rieseguita indipendentemente da tutte le altre migrazioni. Avvia la console e fai questo:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
Più utilmente questo potrebbe essere messo in un compito di rake ecc.
change
, esegui YourMigrations.migrate(:up)
invece (o :down
anche
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
provalo.
VERSION
è solo una variabile di ambiente, quindi può essere la prima nel comando o addirittura impostata prima del comando:VERSION=20098252345 rake db:migrate
rake db:migrate:redo version='xxxx'
Ricorda di mettere le virgolette intorno a xxxx, xxxx è il timestamp (o ID migrazione) per la tua migrazione.
Puoi controllare i timestamp (ID migrazione) per le migrazioni precedenti che hai eseguito utilizzando
rake db:migrate:status
Espandere la risposta di korch sopra, require
non ha funzionato per me, ma load
ha funzionato. Per essere concreti, per il file di migrazione:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
nella console digitando
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
ha funzionato per me.
> Race.new.min_quantity # => 0
Questo era per ruby 1.9.3p484 (2013-11-22 revisione 43786) [x86_64-linux] e Rails 3.2.13.
Aggiungendo il mio 2 ¢ a questo perché ho riscontrato lo stesso problema:
Se desideri assolutamente eseguire di nuovo una migrazione senza crearne una nuova, puoi procedere come segue:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
E rails "dimenticherà" di aver eseguito la migrazione per 20150105181157. Ora, quando esegui db: migrate, lo eseguirà di nuovo.
Questa è quasi sempre una cattiva idea però. L'unico caso in cui potrebbe avere senso è se hai un ramo di sviluppo e non hai ancora arricchito la tua migrazione e vuoi aggiungere alcune cose in fase di sviluppo. Ma anche in questo caso è meglio eseguire la migrazione bidirezionale in modo da poter eseguire correttamente il rollback e riprovare ripetutamente.
Ci deve essere un modo per eseguire la classe di migrazione tramite la console. Non riesco a ottenere il codice di migrazione per essere riconoscibile.
Tuttavia, come indicano i commenti, è preferibile eseguire le migrazioni in ordine. Uso:
rake db:migrate VERSION=##########
Copiare e incollare il codice nella migrazione a script / console?
Ho un metodo di utilità che lo rende molto facile durante lo sviluppo. Trovo che mi aiuti a evitare di creare troppe migrazioni: normalmente modifico le migrazioni fino a quando non sono state distribuite.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
Uso questa tecnica in fase di sviluppo quando modifico una migrazione di una quantità significativa e non voglio migrare verso il basso di una tonnellata e perdere dati in quelli lungo il percorso (specialmente quando sto importando dati legacy che richiedono molto tempo che Non voglio dover reimportare di nuovo).
Questo è 100% hack e sicuramente non consiglierei di farlo in produzione, ma farà il trucco:
STEP=n
argomento adb:migrate
(dov'èn
il numero di migrazioni da eseguire, proprio come c'è perdb:rollback
) - quindi potresti farerake db:migrate STEP=1
orake db:migrate STEP=2
, ecc.