Antworten:
rake db:migrate:redo VERSION=xxxxxxx
, aber das wird den down
und dann den up
Schritt ausführen . Sie können dies in Verbindung mit dem vorübergehenden Auskommentieren des Abwärtsschritts tun.
rake -T
.
db:test:prepare
auch nicht in dieser Liste angezeigt . Gott, ich bin zu spät zur Party.
rake db:migrate:up VERSION=my_version
kann dies möglicherweise nichts bewirken, da die Tabelle schema_migrations weiterhin angibt, dass sie ausgeführt wurde. In der gleichen Situation rake db:migrate:redo VERSION=my_version
kann dies fehlschlagen, da die Tabelle nicht gelöscht werden kann. In diesem Fall kommentieren Sie die down
Methode in der Migration vorübergehend aus und führen Sie sie erneut ausrake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
ähnlich rake db:migrate:down
, um eine bestimmte Migration zu beenden. Sie können eine Liste der verfügbaren Rechenaufgaben mit erhalten rake -T
.
VERSION
hier erwähnte Wert ist der ganzzahlige Wert am Anfang jeder Ihrer Migrationsdateien (dies ist nur der Zeitstempel der Erstellung). Zum Beispiel VERSION=20150720023630
.
VERSION
es sich nur um eine Umgebungsvariable handelt, sodass sie im Befehl an erster Stelle stehen oder sogar vor dem Befehl festgelegt werden kann:VERSION=1234567890 rake db:migrate:up
Ich musste eine einzelne Migration ausführen, die sich geändert hat und unabhängig von allen anderen Migrationen erneut ausgeführt werden musste. Starten Sie die Konsole und gehen Sie folgendermaßen vor:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
Nützlicher könnte dies in eine Rechenaufgabe usw. gesteckt werden.
change
, führen Sie YourMigrations.migrate(:up)
stattdessen (oder :down
auch!) Aus
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
Probieren Sie es aus.
VERSION
ist nur eine Umgebungsvariable, so dass sie im Befehl an erster Stelle stehen oder sogar vor dem Befehl festgelegt werden kann:VERSION=20098252345 rake db:migrate
rake db:migrate:redo version='xxxx'
Denken Sie daran, das Anführungszeichen um xxxx zu setzen. Xxxx ist der Zeitstempel (oder die Migrations-ID) für Ihre Migration.
Sie können die Zeitstempel (Migrations-ID) für die vorherigen Migrationen überprüfen, die Sie mithilfe von durchgeführt haben
rake db:migrate:status
Die Antwort von korch oben zu erweitern, require
hat bei mir nicht funktioniert, aber load
funktioniert. Um konkret zu sein, für die Migrationsdatei:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
in der Konsole tippen
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
arbeitete für mich.
> Race.new.min_quantity # => 0
Dies war für Ruby 1.9.3p484 (2013-11-22 Revision 43786) [x86_64-Linux] und Rails 3.2.13.
Hinzufügen meiner 2 ¢ dazu, weil ich auf dasselbe Problem gestoßen bin:
Wenn Sie eine Migration unbedingt erneut ausführen möchten, ohne eine neue zu erstellen, können Sie Folgendes tun:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
Und Rails "vergisst", dass die Migration für 20150105181157 ausgeführt wurde. Wenn Sie nun db: migrate ausführen, wird sie erneut ausgeführt.
Dies ist jedoch fast immer eine schlechte Idee. Der einzige Fall, in dem dies sinnvoll sein könnte, ist, wenn Sie einen Entwicklungszweig haben und Ihre Migration noch nicht konkretisiert haben und in der Entwicklung einige Dinge hinzufügen möchten. Aber selbst dann ist es besser, die Migration in zwei Richtungen durchzuführen, damit Sie sie ordnungsgemäß zurücksetzen und wiederholt wiederholen können.
Es muss eine Möglichkeit geben, die Migrationsklasse über die Konsole auszuführen. Ich kann nicht scheinen, dass der Migrationscode erkennbar ist.
Wie aus den Kommentaren hervorgeht, wird es jedoch bevorzugt, die Migrationen der Reihe nach auszuführen. Verwenden:
rake db:migrate VERSION=##########
Kopieren Sie Ihren Code und fügen Sie ihn in die Migration zu Skript / Konsole ein?
Ich habe eine Utility-Methode, die dies in der Entwicklung sehr einfach macht. Ich finde, dass es mir hilft, zu viele Migrationen zu vermeiden. Normalerweise ändere ich Migrationen, bis sie bereitgestellt wurden.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
Ich verwende diese Technik in der Entwicklung, wenn ich eine Migration erheblich ändere, und ich möchte nicht eine Tonne nach unten migrieren und dabei keine Daten verlieren (insbesondere, wenn ich Legacy-Daten importiere, die lange dauern Ich möchte nicht erneut importieren müssen.
Dies ist 100% hackisch und ich würde definitiv nicht empfehlen, dies in der Produktion zu tun, aber es wird den Trick tun:
STEP=n
Argument hinzudb:migrate
(won
ist die Anzahl der auszuführenden Migrationen, genau wie es für istdb:rollback
) - dann könnten Sierake db:migrate STEP=1
oderrake db:migrate STEP=2
usw.