Harken Sie nur eine Migration


94

Ich versuche, in meiner Rails-App nur eine Migration aus einem ganzen Haufen heraus auszuführen. Wie kann ich das machen? Ich möchte keine der Migrationen davor oder danach ausführen. Vielen Dank.


1
Dies wäre eine praktische Rails-Funktion: Fügen Sie ein STEP=nArgument hinzu db:migrate(wo nist die Anzahl der auszuführenden Migrationen, genau wie es für ist db:rollback) - dann könnten Sie rake db:migrate STEP=1oder rake db:migrate STEP=2usw.
user664833

Antworten:


164

rake db:migrate:redo VERSION=xxxxxxx, aber das wird den downund dann den upSchritt ausführen . Sie können dies in Verbindung mit dem vorübergehenden Auskommentieren des Abwärtsschritts tun.


Hmm, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo scheint kein VERSION-Argument zu akzeptieren.
Terry G Lorber

3
@pedrorolo: Dies ist nicht veraltet. Diese Aufgabe hat keine Beschreibung und wird daher nicht in angezeigt rake -T.
Ryan Bigg

1
@pedrorolo: wird db:test:prepareauch nicht in dieser Liste angezeigt . Gott, ich bin zu spät zur Party.
mraaroncruz

9
Wenn Ryan die Tabelle außerhalb von Rails aus der Datenbank entfernt hat, rake db:migrate:up VERSION=my_versionkann dies möglicherweise nichts bewirken, da die Tabelle schema_migrations weiterhin angibt, dass sie ausgeführt wurde. In der gleichen Situation rake db:migrate:redo VERSION=my_versionkann dies fehlschlagen, da die Tabelle nicht gelöscht werden kann. In diesem Fall kommentieren Sie die downMethode in der Migration vorübergehend aus und führen Sie sie erneut ausrake db:migrate:redo...
Leo

3
Und um zu erweitern, was @Leo sagt, wenn die Migration mit def change definiert ist, ändern Sie sie zusätzlich zu den oben genannten in def self.up.
Valk

70
rake db:migrate:up VERSION=1234567890

ähnlich rake db:migrate:down, um eine bestimmte Migration zu beenden. Sie können eine Liste der verfügbaren Rechenaufgaben mit erhalten rake -T.


4
Der VERSIONhier erwähnte Wert ist der ganzzahlige Wert am Anfang jeder Ihrer Migrationsdateien (dies ist nur der Zeitstempel der Erstellung). Zum Beispiel VERSION=20150720023630.
Aaron-Codierung

3
Die Versionen werden schön mit Rake db angezeigt:
migrate

Bemerkenswert ist, dass VERSIONes sich nur um eine Umgebungsvariable handelt, sodass sie im Befehl an erster Stelle stehen oder sogar vor dem Befehl festgelegt werden kann:VERSION=1234567890 rake db:migrate:up
Joshua Pinter

25

Ich musste eine einzelne Migration ausführen, die sich geändert hat und unabhängig von allen anderen Migrationen erneut ausgeführt werden musste. Starten Sie die Konsole und gehen Sie folgendermaßen vor:

>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down

Nützlicher könnte dies in eine Rechenaufgabe usw. gesteckt werden.


6
Das hat super funktioniert. Sie können den Code aus der Migration auch einfach kopieren und in die Konsole einfügen, um die Klasse zu definieren (und dies ermöglicht bei Bedarf eine manuelle Bearbeitung, wenn Sie beispielsweise gerade einen Fehler in Dev gemacht haben). Wenn Sie eine reversible Migration mit definiert haben change, führen Sie YourMigrations.migrate(:up)stattdessen (oder :downauch!) Aus
trisweb

1
Sie müssen möglicherweiserequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

15

rake db:migrate:up VERSION=version_no

Migriert (fügt) ein bestimmtes Migrationsskript hinzu

rake db:migrate:down VERSION=version_no

Löscht ein bestimmtes Migrationsskript


10
rake db:migrate VERSION=20098252345

Probieren Sie es aus.


7
Ich denke, dies wird alle Migrationen bis zu der von Ihnen angegebenen ausführen.
Ken Liu

1
schließen, aber das führt auch alle Migrationen vor der spezifischen Migration aus.
Anon

6
Ich denke nicht, dass Sie nur eine Migration ausführen sollten / wollen, ohne die vorherigen zu berücksichtigen. Eine Migration ist eine Darstellung der Datenbankstruktur in Bezug auf den Code zu einem bestimmten Zeitpunkt und damit die Migrationen, bevor dies erforderlich ist. Wenn Sie nur eine Migration ausführen möchten, haben Sie wahrscheinlich nicht die richtigen Auf- / Ab-Vorgänge geschrieben, um die Migrationen funktionsfähig zu halten. Es ist eine schlechte Angewohnheit, nur Ihre Aufwärtsmigrationen zu schreiben.
JP Silvashy

1
Bemerkenswert: VERSIONist nur eine Umgebungsvariable, so dass sie im Befehl an erster Stelle stehen oder sogar vor dem Befehl festgelegt werden kann:VERSION=20098252345 rake db:migrate
Joshua Pinter

4
rake db:migrate:redo version='xxxx'   

Denken Sie daran, das Anführungszeichen um xxxx zu setzen. Xxxx ist der Zeitstempel (oder die Migrations-ID) für Ihre Migration.

Sie können die Zeitstempel (Migrations-ID) für die vorherigen Migrationen überprüfen, die Sie mithilfe von durchgeführt haben

rake db:migrate:status    

3

Die Antwort von korch oben zu erweitern, requirehat bei mir nicht funktioniert, aber loadfunktioniert. Um konkret zu sein, für die Migrationsdatei:

    class ChangeMinQuantityToRaces < ActiveRecord::Migration
      def change
        change_column :races, :min_quantity, :integer, :default => 0
      end
    end

in der Konsole tippen

    > load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
    > ChangeMinQuantityToRaces.new.change

arbeitete für mich.

    > Race.new.min_quantity # => 0 

Dies war für Ruby 1.9.3p484 (2013-11-22 Revision 43786) [x86_64-Linux] und Rails 3.2.13.


2

Hinzufügen meiner 2 ¢ dazu, weil ich auf dasselbe Problem gestoßen bin:

Wenn Sie eine Migration unbedingt erneut ausführen möchten, ohne eine neue zu erstellen, können Sie Folgendes tun:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

Und Rails "vergisst", dass die Migration für 20150105181157 ausgeführt wurde. Wenn Sie nun db: migrate ausführen, wird sie erneut ausgeführt.

Dies ist jedoch fast immer eine schlechte Idee. Der einzige Fall, in dem dies sinnvoll sein könnte, ist, wenn Sie einen Entwicklungszweig haben und Ihre Migration noch nicht konkretisiert haben und in der Entwicklung einige Dinge hinzufügen möchten. Aber selbst dann ist es besser, die Migration in zwei Richtungen durchzuführen, damit Sie sie ordnungsgemäß zurücksetzen und wiederholt wiederholen können.


1

Es muss eine Möglichkeit geben, die Migrationsklasse über die Konsole auszuführen. Ich kann nicht scheinen, dass der Migrationscode erkennbar ist.

Wie aus den Kommentaren hervorgeht, wird es jedoch bevorzugt, die Migrationen der Reihe nach auszuführen. Verwenden:

rake db:migrate VERSION=##########

Kopieren Sie Ihren Code und fügen Sie ihn in die Migration zu Skript / Konsole ein?



0

Ich verwende diese Technik in der Entwicklung, wenn ich eine Migration erheblich ändere, und ich möchte nicht eine Tonne nach unten migrieren und dabei keine Daten verlieren (insbesondere, wenn ich Legacy-Daten importiere, die lange dauern Ich möchte nicht erneut importieren müssen.

Dies ist 100% hackisch und ich würde definitiv nicht empfehlen, dies in der Produktion zu tun, aber es wird den Trick tun:

  1. Verschieben Sie die Migration, die Sie erneut aus ihrem Verzeichnis ausführen möchten, an einen temporären Ort
  2. Generieren Sie eine weitere Migration mit demselben Namen
  3. Kopieren Sie den ursprünglichen Migrationscode und fügen Sie ihn in die neu generierte Migrationsdatei ein
  4. Führen Sie die neue Migration aus
  5. Löschen Sie die neu generierte Migrationsdatei
  6. Bearbeiten Sie Ihre Schemamigrationen, um den neuesten Wert zu entfernen
  7. Stellen Sie die alte Migrationsdatei wieder her
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.