Gibt es eine einfache Möglichkeit, eine einzelne Migration auszuführen? Ich möchte nicht auf eine bestimmte Version migrieren, sondern nur eine bestimmte ausführen.
Gibt es eine einfache Möglichkeit, eine einzelne Migration auszuführen? Ich möchte nicht auf eine bestimmte Version migrieren, sondern nur eine bestimmte ausführen.
Antworten:
Sie können den Code einfach direkt aus der Ruby-Datei ausführen:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Hinweis: Neuere Versionen von Schienen erfordern möglicherweise AddFoos.new.upeher als AddFoos.up.
Ein alternativer Weg (ohne IRB), der sich auf die Tatsache stützt, dass ein Array von Klassennamen zurückgegeben werden muss:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Beachten Sie, dass in diesem schema_migrationsFall die Tabelle wahrscheinlich nicht aktualisiert wird, aber anscheinend möchten Sie dies trotzdem.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"dannAddFoos.new.up
changeanstelle von upund verwendet down, müssen Sie ausführenAddFoos.new.migrate(:up)
AddFoos.new.change
Unter der Annahme einer relativ neuen Version von Rails können Sie immer Folgendes ausführen:
rake db:migrate:up VERSION=20090408054532
Wobei version der Zeitstempel im Dateinamen der Migration ist.
Bearbeiten: Irgendwann in den letzten 8 Jahren (ich bin nicht sicher, welche Version) hat Rails Überprüfungen hinzugefügt, die verhindern, dass dies ausgeführt wird, wenn es bereits ausgeführt wurde. Dies wird durch einen Eintrag in der schema_migrationsTabelle angezeigt . Um es erneut auszuführen, führen Sie es rake db:migrate:redo VERSION=20090408054532stattdessen einfach aus .
rake db:migrate:down VERSION=XXX
Wenn Sie eine bestimmte Migration ausführen möchten , tun Sie dies
$ rake db:migrate:up VERSION=20080906120000
Wenn Sie Migrationen mehrmals ausführen möchten , tun Sie dies
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Wenn Sie ein ausführen möchten einzelne Migration mehrere Male, tun
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(Die Versionsnummer finden Sie im Dateinamen Ihrer Migration.)
Bearbeiten: Sie können Ihre Migrationsdatei auch einfach umbenennen, z.
20151013131830_my_migration.rb -> 20151013131831_my_migration.rb
Wenn Sie dann normal migrieren, wird die Migration als neu behandelt (nützlich, wenn Sie in einer Remote-Umgebung (z. B. Staging) migrieren möchten, auf die Sie weniger Kontrolle haben.
Bearbeiten 2 : Sie können auch einfach den Migrationseintrag in der Datenbank nuklearisieren. Z.B:
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migratewird dann die upMethode der Nuked-Migrationen erneut ausführen.
Wenn Sie eine changeMethode wie diese implementiert haben:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
Sie können eine Instanz der Migration und führen Sie erstellen migrate(:up)oder migrate(:down)auf eine Instanz, wie folgt aus :
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
upund verwenden down.
Dies sind die Schritte, um diese Migrationsdatei "20150927161307_create_users.rb" erneut auszuführen.
Kopieren Sie die Klasse in dieser Datei und fügen Sie sie in die Konsole ein.
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps null: false end
end
end
endErstellen Sie eine Instanz der Klasse CreateUsers:c1 = CreateUsers.new
changedieser Instanz aus:c1.changerequire "./db/migrate/20150927161307_create_users.rb"anstelle von Kopieren und Einfügen. Sie können die Klasse dann auf die gleiche Weise ausführen, indem Sie die in der Klasse definierte Methode instanziieren und aufrufen CreateUsers.new.change.
Ab rails 5können Sie auch railsanstelle von verwendenrake
Schienen 3 - 4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Schienen 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
rails db:migrate VERSION=20160920130051
Wenn Sie Probleme mit Pfaden haben, können Sie diese verwenden
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Bitte beachten Sie, dass script/runnerSie möglicherweise stattdessen rails runnerin neuen Schienenumgebungen verwenden müssen.
Wenn Sie es von der Konsole aus ausführen möchten, suchen Sie Folgendes:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
Ich habe die anderen Antworten ausprobiert, aber das Rails.rootFordern ohne hat für mich nicht funktioniert.
Außerdem .migrate(:up)erzwingt part die erneute Ausführung der Migration, unabhängig davon, ob sie bereits ausgeführt wurde oder nicht. Dies ist nützlich, wenn Sie bereits eine Migration ausgeführt haben, diese durch Herumspielen mit der Datenbank rückgängig gemacht haben und eine schnelle Lösung wünschen, um sie wieder zu starten.
Zumindest in der neuesten Rails-Version (5.2 zum Zeitpunkt des Schreibens) gibt es eine weitere Möglichkeit, die ausgeführten Migrationen zu filtern. Man kann einen Filter in a passierenSCOPE Umgebungsvariablen übergeben, der dann zur Auswahl von Migrationsdateien verwendet wird.
Angenommen, Sie haben zwei Migrationsdateien 1_add_foos.rbund werden 2_add_foos.run_this_one.rbausgeführt
SCOPE=run_this_one rails db:migrate:up
wird nur auswählen und ausführen 2_add_foos.run_this_one.rb. Beachten Sie, dass alle Migrationsdateien ausgeführt werden, die dem Bereich entsprechen.