So löschen Sie Migrationsdateien in Rails 3

109

Ich möchte eine Migrationsdatei entfernen / löschen. Wie würde ich das machen? Ich weiß, dass es hier ähnliche Fragen gibt, aber gibt es als Update einen besseren Weg als Script / Destroy?

Sollte ich auch eine db:resetoder db:dropeine Migration entfernen / löschen?

Alvincrespo
quelle

Antworten:

142

Ich für gewöhnlich:

  1. Führen Sie a rake db:migrate VERSION=XXX in allen Umgebungen eine Version mit der Version vor der vor, die ich löschen möchte.
  2. Löschen Sie die Migrationsdatei manuell.
  3. Wenn ausstehende Migrationen vorliegen (dh die von mir entfernte Migration war nicht die letzte), führe ich einfach rake db:migrateerneut eine neue durch .

Wenn sich Ihre Anwendung bereits in der Produktion oder im Staging befindet, ist es sicherer, einfach eine weitere Migration zu schreiben, die Ihre Tabelle oder Spalten zerstört.

Eine weitere gute Referenz für Migrationen ist: http://guides.rubyonrails.org/migrations.html

Fábio Batista
quelle
2
Würde das Löschen der Migration und das anschließende Ausführen einer Datenbank: migrate die erstellte Tabelle löschen?
Alvincrespo
2
Nein, da Rails nicht wissen würde, wie man es löscht. Es muss die self.downbei Ihrer Migration definierte Methode aufrufen, um Ihre Datenbank "herunterzustufen".
Fábio Batista
35
Wenn Sie die Datei bereits gelöscht haben, ohne zu bemerken, dass Rails nicht so einfach loslässt, rake db:migrate:statuswird Ihnen die ID der fehlenden Datei angezeigt, mit der Sie sie neu erstellen können. Sobald es zurück ist, können Sie den Ratschlägen dieser Antwort zum Sieg folgen.
Jordan Feldstein
1
@ JordanFeldstein, danke. db:migrate:statusist ein Lebensretter!
Dee
1
@Lucas, sobald die Migrationsdatei entfernt wurde, kann sie nicht mehr rückgängig gemacht werden. Aus diesem Grund müssen Sie es in allen bereits ausgeführten Umgebungen (Produktion, Entwicklung, Test, Staging usw.) zurücksetzen, bevor Sie die Datei löschen. Aus diesem Grund habe ich auch geschrieben, dass es sicherer ist, einfach eine weitere Migration zu erstellen, um diese alte wiederherzustellen, sobald sie bereits in der Produktion ausgeführt wird.
Fábio Batista
68

Eine andere Möglichkeit, die Migration zu löschen:

$ rails d migration SameMigrationNameAsUsedToGenerate

Verwenden Sie es, bevor rake db:migratees ausgeführt wird, da Änderungen in der Datenbank für immer bleiben :) - oder entfernen Sie Änderungen manuell

Gediminas
quelle
3
"Wenn sich Ihre Anwendung bereits in der Produktion oder im Staging befindet, ist es sicherer, nur eine weitere Migration zu schreiben, die Ihre Tabelle oder Spalten zerstört." Änderungen bleiben also nicht für immer in der Datenbank
JohnMerlino
8
"D" steht übrigens für "zerstören".
Greg M. Krsak
21

Führen Sie die folgenden Befehle aus dem Home-Verzeichnis der App aus:

  1. rake db:migrate:down VERSION="20140311142212" (Hier ist die Version der Zeitstempel, den Rails beim Erstellen der Migration vorangestellt hat. Durch diese Aktion werden DB-Änderungen aufgrund dieser Migration zurückgesetzt.)

  2. Run "rails destroy migration migration_name"(Der Migrationsname wird beim Erstellen der Migration ausgewählt. Entfernen Sie " timestamp_ " aus dem Namen Ihrer Migrationsdatei, um ihn abzurufen. )

Fuchs
quelle
Rake zerstören Migration AddFileToTable Rake abgebrochen! Ich weiß nicht, wie ich die Aufgabe 'destroy' erstellen soll (siehe vollständige Ablaufverfolgung, indem ich die Aufgabe mit --trace ausführe)
sadaf2605
3
Für # 2 ist der richtige Befehl:rails d migration migration_name
Mauriciomdea
1
Vielen Dank für den Hinweis "Timestamp_ entfernen", den ich brauchte
LightMan
10

Sie können auch eine Downmigration wie folgt ausführen:

rake db:migrate:down VERSION=versionnumber

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

Vicky
quelle
9

Wir können benutzen,

$ rails d migration table_name  

Dadurch wird die Migration gelöscht.

Agnes
quelle
1
Ich denke, es sollte eher Modellname als Tabellenname sein
Ajeet Khan
3

Manchmal habe ich die Migrationsdatei und dann den entsprechenden Eintrag in der Tabelle schema_migrations aus der Datenbank gelöscht. Nicht schön, aber es funktioniert.

frenesim
quelle
3

Dies funktioniert auch in Rails 5.

Wenn die Migration die letzte war, können Sie die Datenbankspalte (n) entfernen, die die Migration hinzugefügt hat, indem Sie Folgendes tun:

rake db:rollback

Entfernen Sie dann die Migrationsdatei selbst, indem Sie Folgendes ausführen:

rails d migration WhateverYourMigrationWasNamed.rb 
random_user_0891
quelle
1

Keine dieser Antworten passte ganz zu dem Problem, das ich hatte, da die zu löschende Migration fehlte: Ich hatte eine Migration in einem anderen Zweig erstellt und ausgeführt, die dann verworfen wurde. Das Problem ist, wenn eine Migration ausgeführt wird, fügt Rails die Version einer schema_migrationsTabelle in der Datenbank hinzu. Selbst wenn es nicht in Ihrer Datenbankstruktur oder Ihrem Schema aufgeführt ist, sucht Rails danach. Sie können diese verwaisten Migrationen anzeigen, indem Sie Folgendes ausführen:

rails db:migrate:status

Beachten Sie die Versionen der fehlenden Migrationen und gehen Sie in die Datenbankkonsole:

rails dbconsole

Entfernen Sie nun die Versionen manuell aus der Migrationstabelle:

delete from schema_migrations where version='<version>';

Du solltest jetzt gut sein.

stackPusher
quelle
0

Ich hatte gerade das gleiche Problem:

  1. Schienen d Migration fuu - löschte die Migration mit dem letzten Zeitstempel
  2. Schienen d Migration fuu - dies löschte die andere Migration
  3. Verwenden Sie den Git-Status, um zu überprüfen, ob die nicht verfolgten Dateien nicht mehr vorhanden sind
  4. Schienen g Migration fuu

Das hat es für mich behoben

Miguel Alatorre
quelle
0

Randnotiz: Ab Schienen 5.0.0 rakewurde in rails So führen Sie Folgendes aus

Schienen db: migriere VERSION = 0

Mohamed Daw
quelle