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.up
eher 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_migrations
Fall 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
change
anstelle von up
und 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_migrations
Tabelle angezeigt . Um es erneut auszuführen, führen Sie es rake db:migrate:redo VERSION=20090408054532
stattdessen 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:migrate
wird dann die up
Methode der Nuked-Migrationen erneut ausführen.
Wenn Sie eine change
Methode 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)
up
und 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
end
Erstellen Sie eine Instanz der Klasse CreateUsers
:c1 = CreateUsers.new
change
dieser Instanz aus:c1.change
require "./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 5
können Sie auch rails
anstelle 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/runner
Sie möglicherweise stattdessen rails runner
in 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.root
Fordern 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.rb
und werden 2_add_foos.run_this_one.rb
ausgefü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.