Jak przywrócić określoną migrację?

807

Mam następujący plik migracji db\migrate\20100905201547_create_blocks.rb

Jak mogę w szczególności przywrócić ten plik migracji?

Uczeń
źródło
1
Czy to rozwiązuje problem? Musisz tylko zrobić Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich
4
Wszystkie informacje na temat migracji tutaj
Nishutosh Sharma
1
Czy chcesz wycofać tylko tę pojedynczą migrację (nawet jeśli później pojawią się nowsze migracje)? A może chcesz przywrócić bazę danych do stanu, w jakim znajdowała się przed tą migracją i późniejszymi migracjami?
Jon Schneider

Odpowiedzi:

1340
rake db:rollback STEP=1

Jest to sposób, aby to zrobić, jeśli migracja, którą chcesz przywrócić, jest ostatnią zastosowaną. Możesz zastąpić 1 dowolną liczbą migracji, do których chcesz wrócić.

Na przykład:

rake db:rollback STEP=5

Cofa również całą migrację, która nastąpiła później (4, 3, 2, a także 1).

Aby wycofać wszystkie migracje z powrotem do migracji docelowej (włącznie z nią), użyj: (To poprawione polecenie zostało dodane PO wszystkich komentarzach wskazujących błąd w oryginalnym poście)

rake db:migrate VERSION=20100905201547

Aby wycofać TYLKO JEDNĄ migrację specyficzną (POZA ZAMÓWIENIEM), użyj:

rake db:migrate:down VERSION=20100905201547

Zauważ, że NIE spowoduje to wycofania żadnych pośrednich migracji - tylko tej wymienionej na liście. Jeśli nie jest to zamierzone, możesz bezpiecznie uruchomić rake db:migratei ponownie uruchomi tylko ten jeden, pomijając wszystkie inne, które nie zostały wcześniej wycofane.

A jeśli kiedykolwiek chcesz migrować pojedynczą migrację poza kolejnością, istnieje również jej odwrotność db:migrate:up:

rake db:migrate:up VERSION=20100905201547
Zachary Wright
źródło
14
„Aby przywrócić do określonej wersji” - czy następujące po niej polecenie przywraca tylko określoną migrację, a nie przywraca ją do tej wersji?
Andrew Grimm,
10
„Aby przywrócić do określonej wersji, użyj ...” Ta odpowiedź jest niepoprawna! Spowoduje to wycofanie migracji w izolacji, jak wyjaśniono w innych odpowiedziach.
Rhys van der Waerden,
3
OSTRZEŻENIE: Popełniłem ten błąd: używaj tylko prowizji db: migruj: w dół WERSJA = 20100905201547, aby wycofać w izolacji !!! jeden plik migracji. Jest to wspomniane w powyższym komentarzu, ale mi tego brakowało.
pixelearth
3
Kolejne słowo ostrzeżenia - nigdy tego nie rób STEP=-1. Zrobiłem to raz i oszalało, wycofując wszystko. Niemiły! To był Rails 4.2 - myślę, że można go teraz naprawić.
Dave Hartnoll,
1
Napisałem artykuł na moim blogu na temat migracji, który wyjaśnia, jak i kiedy używać tych poleceń: railsguides.net/polish-rails-migrations
ka8725
867
rake db:migrate:down VERSION=20100905201547

przywróci określony plik.


Aby znaleźć wersję wszystkich migracji, możesz użyć tego polecenia:

rake db:migrate:status

Lub po prostu przedrostek nazwy pliku migracji to wersja, którą musisz przywrócić.


Zobacz pozycję przewodnika Ruby on Rails dotyczącą migracji.

John Creamer
źródło
48
Zdecydowanie preferowana odpowiedź w mojej opinii.
streetlogics
30
Warto wspomnieć, że jeśli wycofasz konkretną migrację i nie chcesz, aby migrowała ponownie przy nadchodzących zadaniach rake, a następnie usuń również plik migracji.
BradGreens,
4
Uwaga: wydaje się, że jeśli migracja w górę nigdy się nie powiodła, ale została wykonana tylko częściowo, to w dół nic nie robi.
cyrilchampier
1
@nerith, prawdopodobnie dotyczy to tylko baz danych, które nie obsługują Transactional DDL. MySQL nie obsługuje Transactional DDL: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL robi: wiki.postgresql.org/wiki/... Jeśli więc migracja do bazy danych MySQL jest zepsuta musisz ręcznie usunąć część migracji, która się powiodła.
Иван Бишевац
1
Kolejne spostrzeżenie dotyczące komentarza @BradGreens. Jeśli chcesz usunąć plik migracji, który został już wdrożony, będziesz chciał wycofać produkcję / przemieszczanie przed zatwierdzeniem kodu z usuniętym plikiem. W przeciwnym razie nie będzie można przywrócić / migrować: w dół.
AdamT,
57

Aby cofnąć ostatnią migrację, możesz:

rake db:rollback

Jeśli chcesz przywrócić określoną migrację do wersji, wykonaj następujące czynności:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Na przykład jeśli wersja to 20141201122027, zrobisz:

rake db:migrate:down VERSION=20141201122027

wycofać tę konkretną migrację.

Waleed
źródło
32

Możesz cofnąć migrację, używając rake db:rollbackróżnych opcji. Składnia będzie inna w zależności od wymagań.

Jeśli chcesz cofnąć tylko ostatnią migrację, możesz użyć jednego z nich

rake db:rollback

lub

rake db:rollback STEP=1

Jeśli chcesz cofnąć liczbę migracji naraz, wystarczy przekazać argument:

rake db:rollback STEP=n

gdzie njest liczba migracji do wycofania, licząc od ostatniej migracji.

Jeśli chcesz przywrócić określoną migrację, powinieneś przekazać wersję migracji w następujący sposób:

rake db:migrate:down VERSION=xxxxx

gdzie xxxxx to numer wersji migracji.

uma
źródło
1
dodając: down nie działa jednak poprawna odpowiedź jest bez
downa
26

rake db:migrate:down VERSION=your_migrations's_version_number_here

Wersja jest numerycznym prefiksem nazwy pliku migracji

Jak znaleźć wersję :

Twoje pliki migracji są przechowywane w twoim rails_root/db/migratekatalogu. Znajdź odpowiedni plik, do którego chcesz przywrócić, i skopiuj numer prefiksu.

na przykład

nazwa pliku: 20140208031131_create_roles.rb wtedy jest wersja20140208031131

Hardik
źródło
6
Najprostszym sposobem na znalezienie identyfikatora migracji jest uruchomienierake db:migrate:status
Aeradriel
18

Cofanie ostatniej migracji:

# rails < 5.0
rake db:rollback

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

Cofanie ostatniej nliczby migracji

# rails < 5.0
rake db:rollback STEP=2

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

Cofanie określonej migracji

# 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
Deepak Mahakale
źródło
14

Aby cofnąć ostatnią migrację, możesz:

rake db:rollback

Jeśli chcesz przywrócić określoną migrację do wersji, wykonaj następujące czynności:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Jeśli wywołany został plik migracji, który chcesz wycofać db/migrate/20141201122027_create_some_table.rb, to WERSJA dla tej migracji to 20141201122027znacznik czasu, w którym migracja została utworzona, a polecenie cofnięcia migracji to:

rake db:migrate:down VERSION=20141201122027
Sandip Vavhal
źródło
6

Jeśli jest to migracja odwracalna i ostatnia, która została wykonana, uruchom rake db:rollback. I zawsze możesz użyć wersji. na przykład

plik migracji to 20140716084539_create_customer_stats.rb, więc polecenie przywracania będzie: rake db:migrate:down VERSION=20140716084539

Santanu
źródło
6

Aby przywrócić wszystkie migracje do określonej wersji (np. 20181002222222), Użyj:

rake db:migrate VERSION=20181002222222

(Pamiętaj, że to używa db:migrate- nie db:migrate:downtak jak w innych odpowiedziach na to pytanie).

Zakładając, że określona wersja migracji jest starsza niż bieżąca wersja, spowoduje to wycofanie wszystkich migracji do określonej wersji, ale bez uwzględnienia.

Na przykład, jeśli rake db:migrate:statuspoczątkowo wyświetla się:

  (... 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

Bieganie:

rake db:migrate VERSION=20181002222222

Spowoduje to:

  (... 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

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

Jon Schneider
źródło
4

Z przewodnika po szynach

Cofanie poprzednich migracji

Możesz użyć funkcji Active Record do wycofania migracji przy użyciu revertmetody:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

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

revertSposób przyjmuje również bloku instrukcji do odwrócenia. Może to być przydatne do przywrócenia wybranych części poprzednich migracji. Wyobraźmy sobie na przykład, że CreateBlock został popełniony, i później postanowiono, że do weryfikacji kodu pocztowego najlepiej będzie użyć walidacji Active Record, zamiast ograniczenia CHECK.

    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

Tę samą migrację można również napisać bez użycia przywracania, ale wymagałoby to jeszcze kilku kroków: odwrócenie kolejności tworzenia_tabeli i odwracania, zamiana create_table na drop_table, a na koniec zastąpienie w dół i odwrotnie. Wszystko zostało załatwione przez cofnięcie.

Manish Shrivastava
źródło
3

Migracje zmieniają stan bazy danych za pomocą polecenia

$ bundle exec rake db:migrate

Możemy cofnąć pojedynczy krok migracji za pomocą

  $ bundle exec rake db:rollback

Aby wrócić do samego początku, możemy użyć

  $ bundle exec rake db:migrate VERSION=0

Jak można się domyślić, podstawienie dowolnej innej liczby na 0 powoduje migrację do tego numeru wersji, gdzie numery wersji pochodzą z listy migracji po kolei

Nirupa
źródło
2

Cóż, w Railsach 5 jest to dość łatwe rake db: migrate: status lub rails db: migrate: status

Został zmodyfikowany, aby obsługiwać oba w ten sam sposób. Następnie wybierz wersję, którą chcesz wycofać, a następnie uruchom rake db: migruj VERSION = 2013424230423

Upewnij się, że WERSJA składa się z wielkich liter

Jeśli masz problem z którymkolwiek etapem migracji lub utknąłeś na środku, po prostu przejdź do pliku migracji i skomentuj linie, które już zostały zmigrowane.

Mam nadzieję, że to pomaga

Shahin
źródło
1
Podświetlam wskazówkę dotyczącą komendy rake db: migrate: status . . . Świetnie nadaje się do przeglądu, aby zobaczyć bieżący stan wykonania plików migracji.
Beauty
1

Jeśli chcesz przywrócić i przeprowadzić migrację, możesz uruchomić:

rake db:migrate:redo

To to samo co:

rake db:rollback
rake db:migrate
Iwan B.
źródło