Jak cofnąć migrację specyficzną?

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

Jak konkretnie mogę cofnąć ten plik migracji?

Author: tronerta, 2010-09-05

14 answers

rake db:rollback STEP=1

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

Na przykład:

rake db:rollback STEP=5

Wycofa również wszystkie migracje, które miały miejsce później (4, 3, 2 i również 1).

Aby cofnąć wszystkie migracje z powrotem do (włącznie) migracji docelowej, użyj: (ta poprawiona komenda została dodana po wszystkich komentarzach wskazujących na błąd w oryginale post)

rake db:migrate VERSION=20100905201547

W celu wycofania tylko jednej migracji specyficznej (poza kolejnością) użycie:

rake db:migrate:down VERSION=20100905201547

Zauważ, że nie cofnie to żadnych wstawiających migracji - tylko tej wymienionej. Jeśli to nie jest to, co zamierzałeś, możesz bezpiecznie uruchomić rake db:migrate i ponownie uruchomić tylko ten jeden, pomijając wszystkie inne, które nie zostały wcześniej wycofane.

I jeśli kiedykolwiek chcesz migrować pojedynczą migrację Nie w porządku, istnieje również jej odwrotność db:migrate:up:

rake db:migrate:up VERSION=20100905201547
 1451
Author: Zachary Wright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-03 10:40:11
rake db:migrate:down VERSION=20100905201547

Cofnie określony plik.


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

rake db:migrate:status

Lub po prostu prefiks nazwy pliku migracji to wersja, którą musisz wycofać.


Zobacz Ruby on Rails przewodnik {[12] } na temat migracji.

 886
Author: John Creamer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 07:57:18

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

rake db:rollback

Jeśli chcesz cofnąć konkretną migrację z wersją, powinieneś wykonać:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Na przykład, jeśli wersja jest 20141201122027, wykonasz:

rake db:migrate:down VERSION=20141201122027

Aby cofnąć tę migrację specyficzną.

 60
Author: Waleed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-02 07:26:08

Możesz cofnąć migrację, używając rake db:rollback z różnymi opcjami. Składnia będzie różna w zależności od twoich wymagań.

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

rake db:rollback

Lub

rake db:rollback STEP=1

Jeśli chcesz cofnąć liczbę migracji na raz, po prostu podaj argument:

rake db:rollback STEP=n

Gdzie n jest liczbą migracji do wycofania, licząc od ostatniej migracji.

Jeśli chcesz cofnąć się do określonego migracja, następnie należy przekazać wersję migracji w następujący sposób:

rake db:migrate:down VERSION=xxxxx

Gdzie xxxxx jest numerem wersji migracji.

 35
Author: uma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-17 16:41:56

rake db:migrate:down VERSION=your_migrations's_version_number_here

Wersja jest prefiksem numerycznym nazwy pliku migracji

Jak znaleźć wersję :

Twoje pliki migracji są przechowywane w katalogu rails_root/db/migrate. Znajdź odpowiedni plik, do którego chcesz cofnąć i skopiuj numer prefiksu.

Na przykład

Nazwa pliku: 20140208031131_create_roles.rb następnie wersja to 20140208031131

 28
Author: Hardik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-22 06:58:15

Cofnięcie ostatniej migracji:

# rails < 5.0
rake db:rollback

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

Cofanie ostatniego n Liczba migracji

# rails < 5.0
rake db:rollback STEP=2

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

Cofnięcie migracji specyficznej

# 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
 18
Author: Deepak Mahakale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-23 17:47:15

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

rake db:rollback

Jeśli chcesz cofnąć konkretną migrację z wersją, powinieneś wykonać:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Jeśli plik migracji, który chcesz wycofać, został wywołany db/migrate/20141201122027_create_some_table.rb, to wersją dla tej migracji jest 20141201122027, która jest znacznikiem czasu utworzenia tej migracji, a komenda do wycofania tej migracji brzmiałaby:

rake db:migrate:down VERSION=20141201122027
 14
Author: Sandip Vavhal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-20 12:01:40

Aby cofnąć wszystkie migracje do określonej wersji (np. 20181002222222), Użyj:

rake db:migrate VERSION=20181002222222

(zauważ, że to używa db:migrate -- Nie db:migrate:down jak w innych odpowiedziach na to pytanie.)

Zakładając, że określona wersja migracji jest starsza od bieżącej wersji, spowoduje to cofnięcie wszystkich migracji do określonej wersji, ale nie włączając jej.

Na przykład, jeśli rake db:migrate:status początkowo wyświetla:

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

Running:

rake db:migrate VERSION=20181002222222

Spowoduje in:

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

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

 7
Author: Jon Schneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-10 18:03:41

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

Plik migracji to 20140716084539_create_customer_stats.rb, więc Komenda rollback będzie, rake db:migrate:down VERSION=20140716084539

 6
Author: Santanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 09:39:21

From Rails Guide

Przywracanie Poprzednich Migracji

Możesz użyć funkcji Active Record Do Cofania migracji za pomocą metody revert:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

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

Metoda revert akceptuje również blok instrukcji do odwrócenia. Może to być przydatne do przywrócenia wybranych części poprzednich migracji. Na przykład, wyobraźmy sobie, że createblock jest zaangażowany i później zdecydowano, że najlepiej byłoby użyć walidacji rekordów aktywnych, zamiast ograniczenia sprawdzania, aby zweryfikować kod zipcode.

    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

Ta sama migracja mogła być również napisana bez użycia revert, ale wymagałoby to kilku kroków: odwrócenia kolejności create_table i reversible, zastąpienia create_table przez drop_table, a na koniec zastąpienia up przez down I vice-versa. Tym wszystkim zajmuje się revert.

 4
Author: Manish Shrivastava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-29 08:05:30

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 początku, możemy użyć

  $ bundle exec rake db:migrate VERSION=0

Jak można się domyślić, zastąpienie dowolnej innej liczby 0 migruje na ten numer wersji, gdzie numery wersji pochodzą z listy migracji kolejno

 3
Author: Nirupa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-06 20:11:13

NO w rails 5 to całkiem proste 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ć and then run rake db:migrate VERSION=2013424230423

Upewnij się, że wersja to wszystkie duże litery

Jeśli masz problem z jakimkolwiek krokiem migracji lub utkniesz w środku, po prostu przejdź do pliku migracji i skomentuj linie, które zostały już zmigrowane.

Nadzieja to pomaga

 2
Author: Shahin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-20 17:07:23

Jeśli chcesz cofnąć i przenieść, możesz uruchomić:

rake db:migrate:redo

To to samo co:

rake db:rollback
rake db:migrate
 1
Author: Iwan B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 20:51:28

Dodatkowo

Kiedy migracja została wdrożona dawno temu, nie pozwala na migrację nowej.

Stało się tak, że pracuję w większej aplikacji Rails z ponad tysiącem plików migracyjnych. I, trwa miesiąc dla nas, aby wysłać funkcję średniej wielkości. Pracowałem nad funkcjonalnością i wdrożyłem migrację miesiąc temu, a następnie w procesie przeglądu zmieniła się struktura migracji i nazwa pliku, teraz próbuję wdrożyć mój nowy kod, kompilacja nie powiodła się mówiąc

ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERROR:  column "my_new_field" of relation "accounts" already exists

Brak z wyżej wymienionych rozwiązań zadziałało dla mnie, ponieważ brakowało starego pliku migracji, a pole, które zamierzałem utworzyć w moim nowym pliku migracji, już istniało w DB. Jedyne rozwiązanie, które mi się udało to:

  1. i scped plik Na Serwer
  2. otworzyłem rails console
  3. wymagałem pliku w sesji IRB
  4. then AddNewMyNewFieldToAccounts.new.down

Wtedy mógłbym ponownie uruchomić kompilację deploy.

Mam nadzieję, że tobie też pomoże.
 1
Author: illusionist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-08 02:15:10