Jak cofnąć migrację specyficzną?
Mam następujący plik migracji db\migrate\20100905201547_create_blocks.rb
Jak konkretnie mogę cofnąć ten plik migracji?
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
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ć.
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ą.
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.
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
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
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
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
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
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.
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
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
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
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:
- i
scp
ed plik Na Serwer - otworzyłem
rails console
- wymagałem pliku w sesji IRB
- then
AddNewMyNewFieldToAccounts.new.down
Wtedy mógłbym ponownie uruchomić kompilację deploy.
Mam nadzieję, że tobie też pomoże.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