Wie kann ich eine bestimmte Migration rückgängig machen?


807

Ich habe die folgende Migrationsdatei db\migrate\20100905201547_create_blocks.rb

Wie kann ich diese Migrationsdatei spezifisch zurücksetzen?


1
Behebt dies das Problem? Sie müssen nur Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich

4
Alle Informationen zu Migrationen hier
Nishutosh Sharma

1
Möchten Sie nur diese einzelne spezifische Migration zurücksetzen (auch wenn neuere Migrationen folgen)? Oder möchten Sie die Datenbank auf den Status zurücksetzen, in dem sie sich vor der Migration befand, und alle nachfolgenden Migrationen wurden angewendet?
Jon Schneider

Antworten:


1340
rake db:rollback STEP=1

Dies ist eine Möglichkeit, wenn die Migration, die Sie zurücksetzen möchten, die zuletzt angewendete ist. Sie können 1 für beliebig viele Migrationen ersetzen, die Sie zurückgehen möchten.

Zum Beispiel:

rake db:rollback STEP=5

Rollt auch die gesamte Migration zurück, die später stattgefunden hat (4, 3, 2 und auch 1).

Verwenden Sie Folgendes, um alle Migrationen auf eine Zielmigration zurückzusetzen (und diese einzuschließen): (Dieser korrigierte Befehl wurde NACH allen Kommentaren hinzugefügt, die auf den Fehler im ursprünglichen Beitrag hinweisen.)

rake db:migrate VERSION=20100905201547

Um NUR EINE bestimmte Migration (außer Betrieb) zurückzusetzen, verwenden Sie:

rake db:migrate:down VERSION=20100905201547

Beachten Sie, dass dadurch KEINE intervenierenden Migrationen zurückgesetzt werden - nur die aufgelistete. Wenn Sie dies nicht beabsichtigt haben, können Sie es sicher ausführen, rake db:migrateund es wird nur dieses erneut ausgeführt, wobei alle anderen übersprungen werden, die zuvor nicht zurückgesetzt wurden.

Und wenn Sie jemals eine einzelne Migration außerhalb der Reihenfolge migrieren möchten, gibt es auch die Umkehrung db:migrate:up:

rake db:migrate:up VERSION=20100905201547

14
"Um ein Rollback auf eine bestimmte Version durchzuführen" - führt der folgende Befehl nicht nur ein Rollback einer bestimmten Migration durch, anstatt den gesamten Rollback auf diese Version durchzuführen?
Andrew Grimm

10
"Um auf eine bestimmte Version zurückzusetzen, verwenden Sie ..." Diese Antwort ist falsch! Dadurch wird die Migration isoliert zurückgesetzt, wie in anderen Antworten erläutert.
Rhys van der Waerden

3
WARNUNG: Ich habe diesen Fehler gemacht: Verwenden Sie nur Rake db: migrate: down VERSION = 20100905201547, um IN ISOLATION zurückzusetzen !!! eine Migrationsdatei. Dies wird im obigen Kommentar erwähnt, aber ich habe es verpasst.
Pixelearth

3
Noch ein Wort der Warnung - niemals tun STEP=-1. Ich habe das einmal gemacht und es wurde verrückt und rollte alles zurück. Nicht nett! Dies war Rails 4.2 - ich denke, es kann jetzt behoben werden.
Dave Hartnoll

1
Schrieb einen Artikel in meinem Blog über Migrationen, in dem erklärt wird, wie und wann diese Befehle verwendet werden sollen: railsguides.net/polish-rails-migrations
ka8725

867
rake db:migrate:down VERSION=20100905201547

rollt die spezifische Datei zurück.


Um die Version aller Migrationen zu finden, können Sie diesen Befehl verwenden:

rake db:migrate:status

Oder das Präfix des Dateinamens der Migration ist einfach die Version, die Sie zurücksetzen müssen.


Weitere Informationen zu Migrationen finden Sie im Ruby on Rails-Handbuch .


48
Auf jeden Fall die bevorzugte Antwort meiner Meinung nach.
Streetlogics

30
Erwähnenswert ist, dass Sie die Migrationsdatei auch löschen, wenn Sie eine bestimmte Migration zurücksetzen und nicht möchten, dass sie bei bevorstehenden Rake-Aufgaben erneut migriert wird.
BradGreens

4
Hinweis: Wenn die Aufwärtsmigration nie erfolgreich war, sondern nur teilweise ausgeführt wurde, führt die Abwärtsmigration anscheinend nichts aus.
Cyrilchampier

1
@nerith, dies gilt wahrscheinlich nur für Datenbanken, die Transactional DDL nicht unterstützen. MySQL unterstützt keine Transaktions-DDL: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL funktioniert: wiki.postgresql.org/wiki/… Wenn Ihre Migration in der MySQL-Datenbank also fehlerhaft ist Dann müssen Sie einen Teil der erfolgreichen Migration manuell löschen.
25ван Бишевац

1
Eine weitere Beobachtung bezüglich @BradGreens Kommentar. Wenn Sie die Migrationsdatei entfernen möchten und sie bereits bereitgestellt wurde, sollten Sie die Produktion / das Staging zurücksetzen, bevor Sie den Code mit der entfernten Datei festschreiben. Andernfalls können Sie kein Rollback / Migrieren durchführen: down.
AdamT

57

So rollen Sie die letzte Migration zurück:

rake db:rollback

Wenn Sie eine bestimmte Migration mit einer Version rückgängig machen möchten, sollten Sie Folgendes tun:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Wenn die Version beispielsweise 20141201122027 lautet, tun Sie Folgendes:

rake db:migrate:down VERSION=20141201122027

um diese spezifische Migration zurückzusetzen.


32

Sie können Ihre Migration rake db:rollbackmit verschiedenen Optionen zurücksetzen. Die Syntax hängt von Ihren Anforderungen ab.

Wenn Sie nur die letzte Migration zurücksetzen möchten, können Sie beide verwenden

rake db:rollback

oder

rake db:rollback STEP=1

Wenn Sie die Anzahl der Migrationen gleichzeitig zurücksetzen möchten, übergeben Sie einfach ein Argument:

rake db:rollback STEP=n

Wo nist die Anzahl der Migrationen zum Rollback, gerechnet von der letzten Migration?

Wenn Sie ein Rollback auf eine bestimmte Migration durchführen möchten, sollten Sie die Version der Migration wie folgt übergeben:

rake db:migrate:down VERSION=xxxxx

Dabei ist xxxxx die Versionsnummer der Migration.


1
Hinzufügen: Down funktioniert nicht, die richtige Antwort ist ohne Down
Elta3lab

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

Die Version ist das numerische Präfix im Dateinamen der Migration

So finden Sie die Version :

Ihre Migrationsdateien werden in Ihrem rails_root/db/migrateVerzeichnis gespeichert . Suchen Sie die entsprechende Datei, bis zu der Sie ein Rollback durchführen möchten, und kopieren Sie die Präfixnummer.

zum Beispiel

Dateiname: 20140208031131_create_roles.rb dann ist die Version20140208031131


6
Der einfachste Weg, um die Migrations-ID zu finden, ist auszuführenrake db:migrate:status
Aeradriel

18

Zurücksetzen der letzten Migration:

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

Zurücksetzen der letzten nAnzahl von Migrationen

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

Zurücksetzen einer bestimmten Migration

# rails < 5.0
rake db:migrate:down VERSION=20100905201547

# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547

14

So rollen Sie die letzte Migration zurück:

rake db:rollback

Wenn Sie eine bestimmte Migration mit einer Version rückgängig machen möchten, sollten Sie Folgendes tun:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Wenn die Migrationsdatei aufgerufen wurde db/migrate/20141201122027_create_some_table.rb, die Sie zurücksetzen möchten, lautet die VERSION für diese Migration. Dies 20141201122027ist der Zeitstempel, zu dem diese Migration erstellt wurde, und der Befehl zum Zurücksetzen dieser Migration lautet :

rake db:migrate:down VERSION=20141201122027

6

Wenn es sich um eine reversible Migration handelt und die letzte, die ausgeführt wurde, führen Sie sie aus rake db:rollback. Und Sie können immer die Version verwenden. z.B

Die Migrationsdatei lautet 20140716084539_create_customer_stats.rb. Der Rollback-Befehl lautet also: rake db:migrate:down VERSION=20140716084539


6

Verwenden Sie Folgendes, um alle Migrationen auf eine bestimmte Version (z. B. 20181002222222) zurückzusetzen:

rake db:migrate VERSION=20181002222222

(Beachten Sie, dass dies verwendet db:migrate- nicht db:migrate:downwie in anderen Antworten auf diese Frage.)

Angenommen, die angegebene Migrationsversion ist älter als die aktuelle Version, werden alle Migrationen bis zur angegebenen Version zurückgesetzt, jedoch nicht eingeschlossen.

Zum Beispiel, wenn rake db:migrate:statusanfänglich angezeigt wird:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  up      20181003171932  Some migration description
  up      20181004211151  Some migration description
  up      20181005151403  Some migration description

Laufen:

rake db:migrate VERSION=20181002222222

Wird darin enden, dass:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  down    20181003171932  Some migration description
  down    20181004211151  Some migration description
  down    20181005151403  Some migration description

Referenz: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations


4

Aus dem Rails Guide

Zurücksetzen früherer Migrationen

Sie können die Fähigkeit von Active Record verwenden, Migrationen mithilfe der folgenden revertMethode zurückzusetzen:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

Die revertMethode akzeptiert auch einen Befehlsblock zum Umkehren. Dies kann nützlich sein, um ausgewählte Teile früherer Migrationen zurückzusetzen. Stellen Sie sich zum Beispiel vor, dass CreateBlock festgeschrieben ist und später entschieden wird, dass es am besten ist, Active Record-Validierungen anstelle der CHECK-Einschränkung zu verwenden, um die Postleitzahl zu überprüfen.

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute <<-SQL
                ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                    CHECK (char_length(zipcode) = 5);
              SQL
            end
            dir.down do
              execute <<-SQL
                ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
              SQL
            end
          end

          # The rest of the migration was ok
        end
      end
    end

Dieselbe Migration hätte auch ohne Verwendung von revert geschrieben werden können, dies hätte jedoch einige weitere Schritte erforderlich gemacht: Umkehren der Reihenfolge von create_table und reversible, Ersetzen von create_table durch drop_table und schließlich Ersetzen von up durch down und umgekehrt. Dies alles wird durch Zurücksetzen erledigt.


3

Migrationen ändern den Status der Datenbank mit dem Befehl

$ bundle exec rake db:migrate

Wir können einen einzelnen Migrationsschritt mit rückgängig machen

  $ bundle exec rake db:rollback

Um den ganzen Weg zurück zum Anfang zu gehen, können wir verwenden

  $ bundle exec rake db:migrate VERSION=0

Wie Sie vielleicht erraten haben, wird das Ersetzen von 0 durch eine andere Nummer zu dieser Versionsnummer migriert, wobei die Versionsnummern aus der sequentiellen Auflistung der Migrationen stammen


2

Nun, in Rails 5 ist es ganz einfach. Rake db: migrate: status oder Rails db: migrate: status

Es wurde so geändert, dass beide gleich behandelt werden. Wählen Sie dann einfach die Version aus, die Sie zurücksetzen möchten, und führen Sie dann rake db aus: migrate VERSION = 2013424230423

Stellen Sie sicher, dass VERSION nur aus Großbuchstaben besteht

Wenn Sie ein Problem mit einem Schritt der Migration haben oder in der Mitte stecken bleiben, gehen Sie einfach zur Migrationsdatei und kommentieren Sie die bereits migrierten Zeilen aus.

Ich hoffe, das hilft


1
Ich hebe den Hinweis für den Befehl rake db: migrate: status hervor . . . Im Überblick können Sie den aktuellen Ausführungsstatus der Migrationsdateien anzeigen.
Schönheit

1

Wenn Sie ein Rollback durchführen und migrieren möchten, können Sie Folgendes ausführen:

rake db:migrate:redo

Das ist das gleiche wie:

rake db:rollback
rake db:migrate
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.