Führen Sie eine einzelne Migrationsdatei aus

267

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.

nan
quelle
Ist dies etwas, das Sie einmal als Migration ausgeführt haben, weil es zufällig benötigt wurde, und sich dann als nützliche Abfrage herausstellt, die möglicherweise mehrmals ausgeführt werden muss? Vielleicht sollten Sie den Inhalt der Migration in ein Modell oder ein anderes Objekt umgestalten und dann die Migrationsreferenz auf diesen neuen Speicherort haben. Anschließend können Sie das neue Objekt einfach an Ihrer Läsion ausführen, indem Sie Ruby in der Befehlszeile aufrufen.
Nathan Feger

Antworten:

239

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.

Orion Edwards
quelle
58
Manchmal benötigen Sie ein './' vor dem erforderlichen Pfad, und die schema_migrations werden definitiv nicht aktualisiert.
Beardo
14
Ich musste eine Instanz des Migrationsobjekts erstellen, bevor ich aufrufen konnte. zBAddFoos.new.up
Bentleyo
15
Also, um es für Rails 3.2 zusammenzufassen: require "./db/migrate/db/migrate/20090408054532_add_foos.rb"dannAddFoos.new.up
Trisweb
50
Wenn Ihre Migration changeanstelle von upund verwendet down, müssen Sie ausführenAddFoos.new.migrate(:up)
Don Werve
6
In Schienen 4 können Sie anrufenAddFoos.new.change
lfender6445
429

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 .

gtd
quelle
124
Eigentlich ist der Befehl Rake db: migrate: redo VERSION = my_version
Chirag Patel
2
@Chirag Patel: Genau das habe ich gesucht! Vielen Dank!
Abel
23
Wiederholen führt die Abwärtsmethode der angegebenen Migration und danach die Aufwärtsmethode aus. up läuft nur mit der up-Methode, und ich denke, genau das will die fragende Person.
Sven Koschnicke
7
'up' wird anscheinend nicht ausgeführt, wenn die Datenbankschemaversion später als die betreffende Migration ist. Dies kann beispielsweise beim Zusammenführen der Änderungen einer anderen Person der Fall sein.
Matt Connolly
3
Danke, ich habe das benutzt fürrake db:migrate:down VERSION=XXX
Nitrodist
107

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.

Benjamin Crouzier
quelle
Sowohl "up" als auch "redo" haben bei mir nicht funktioniert, aber das Löschen der Zeile in schema_migrations war perfekt.
Cesoid
27

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)
Chibicode
quelle
1
Dies gilt auch dann, wenn Sie upund verwenden down.
Gak
17

Dies sind die Schritte, um diese Migrationsdatei "20150927161307_create_users.rb" erneut auszuführen.

  1. Führen Sie den Konsolenmodus aus. (Schienen c)
  2. 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
  3. Erstellen Sie eine Instanz der Klasse CreateUsers:c1 = CreateUsers.new

  4. Führen Sie die Methode changedieser Instanz aus:c1.change
rolph dzounga
quelle
Benötigen Sie nur die Datei mit der Klasse, z. B. in der Konsole: 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.
VinnyQ77
13

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
Deepak Mahakale
quelle
1
es erraten auch, was Sie mitrails db:migrate VERSION=20160920130051
frenesim
12

Wenn Sie Probleme mit Pfaden haben, können Sie diese verwenden

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Dejan Cancarevic
quelle
6

Methode 1 :

rake db:migrate:up VERSION=20080906120000

Methode 2:

In der Rails-Konsole 1. Kopieren Sie die Migrationsklasse in die Konsole (z. B. add_name_to_user.rb). 2. Geben Sie dann in der Konsole Folgendes ein

Sharding.run_on_all_shards{AddNameToUser.up}

Es ist vollbracht!!

Ramya
quelle
5

Bitte beachten Sie, dass script/runnerSie möglicherweise stattdessen rails runnerin neuen Schienenumgebungen verwenden müssen.

viniciusnz
quelle
3

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.

Tasos Anesiadis
quelle
1

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.

szymek
quelle