Jak usunąć pliki migracji w Railsach 3


109

Chciałbym usunąć / skasować plik migracji. Jak bym to zrobił? Wiem, że są tutaj podobne pytania, ale czy jako aktualizacja jest lepszy sposób niż wykonanie skryptu / zniszczenia?

Czy powinienem również wykonać migrację db:resetlub db:dropusunąć / skasować migrację?

Odpowiedzi:


142

Ja zwykle:

  1. Wykonaj a rake db:migrate VERSION=XXXna wszystkich środowiskach, do wersji przed tą, którą chcę usunąć.
  2. Usuń plik migracji ręcznie.
  3. Jeśli są migracje oczekujące (tj. Migracja, którą usunąłem, nie była ostatnią), po prostu rake db:migrateponownie wykonuję nową .

Jeśli Twoja aplikacja jest już w fazie produkcyjnej lub tymczasowej, bezpieczniej jest po prostu napisać kolejną migrację, która zniszczy tabelę lub kolumny.

Innym doskonałym źródłem informacji na temat migracji jest: http://guides.rubyonrails.org/migrations.html


2
Czy usunięcie migracji, a następnie uruchomienie komendy db: migrate wymazałoby utworzoną tabelę?
alvincrespo

2
Nie, ponieważ Railsy nie wiedziałyby, jak to usunąć. Musi wywołać self.downmetodę zdefiniowaną podczas migracji w celu „obniżenia” bazy danych.
Fábio Batista

35
Jeśli już usunąłeś plik, nie zdając sobie sprawy, że rails nie puszczą tak łatwo, rake db:migrate:statuspokaże ci identyfikator brakującego pliku, którego możesz użyć do odtworzenia go. Gdy wróci, możesz postępować zgodnie z radą tej odpowiedzi, aby zwyciężyć.
Jordan Feldstein,

1
@JordanFeldstein, dziękuję. db:migrate:statusratuje życie!
dee

1
@Lucas, po usunięciu pliku migracji nie można go już cofnąć. Dlatego musisz przywrócić go we wszystkich środowiskach, które już działały (produkcyjne, programistyczne, testowe, przemieszczanie itp.) Przed usunięciem pliku. Dlatego też napisałem, że bezpieczniej jest po prostu utworzyć kolejną migrację, aby przywrócić tę starą, gdy jest już uruchomiona na produkcji.
Fábio Batista

68

Inny sposób usunięcia migracji:

$ rails d migration SameMigrationNameAsUsedToGenerate

Użyj go przed rake db:migratewykonaniem, ponieważ zmiany w bazie danych pozostaną na zawsze :) - lub usuń zmiany ręcznie


3
„Jeśli Twoja aplikacja jest już w fazie produkcyjnej lub tymczasowej, bezpieczniej jest po prostu napisać kolejną migrację, która zniszczy tabelę lub kolumny”. Więc zmiany nie pozostają w bazie danych na zawsze
JohnMerlino

8
Nawiasem mówiąc, „d” oznacza „zniszczyć”.
Greg M. Krsak,

21

Uruchom poniższe polecenia z katalogu domowego aplikacji:

  1. rake db:migrate:down VERSION="20140311142212" (w tym przypadku wersja jest sygnaturą czasową dodawaną przez railsy podczas tworzenia migracji. Ta czynność spowoduje cofnięcie zmian bazy danych w wyniku migracji)

  2. Run "rails destroy migration migration_name"(nazwa_migracji to ta, której użyliśmy podczas tworzenia migracji. Usuń „ timestamp_ ” z nazwy pliku migracji, aby ją uzyskać)


rake zniszczyć migrację AddFileToTable rake przerwane! Nie wiem, jak zbudować zadanie „zniszczyć” (zobacz pełną ślad uruchamiając zadanie z --trace)
sadaf2605

3
Dla nr 2 poprawne polecenie to:rails d migration migration_name
mauriciomdea

1
Dzięki za wskazówkę „usuń znacznik czasu_”, której potrzebowałem
LightMan,

10

Możesz również przeprowadzić migrację w dół, na przykład:

rake db:migrate:down VERSION=versionnumber

Więcej informacji znajdziesz w przewodniku Ruby on Rails dotyczącym migracji.


9

Możemy użyć,

$ rails d migration table_name  

Co spowoduje usunięcie migracji.


1
Myślę, że powinna to być nazwa modelu, a nie nazwa_tabeli
Ajeet Khan

3

Czasami zdarzało się, że usuwałem plik migracji, a następnie usuwałem odpowiedni wpis w tabeli schema_migrations z bazy danych. Niezbyt ładne, ale działa.


3

Działa to również w Railsach 5.

Jeśli migracja była ostatnią, możesz usunąć kolumny bazy danych, które dodała migracja, wykonując następujące czynności:

rake db:rollback

następnie usuń sam plik migracji, uruchamiając:

rails d migration WhateverYourMigrationWasNamed.rb 


1

Żadna z tych odpowiedzi nie pasowała do problemu, który miałem, ponieważ brakowało migracji, którą chciałem usunąć: utworzyłem i uruchomiłem migrację w innej gałęzi, która została następnie odrzucona. Problem polega na tym, że po uruchomieniu migracji railsy dodają wersję do schema_migrationstabeli w bazie danych. Więc nawet jeśli nie ma tego na liście w twojej strukturze lub schemacie db, railsy go szukają. Możesz ujawnić te osierocone migracje, uruchamiając:

rails db:migrate:status

Zanotuj wersje brakujących migracji i przejdź do konsoli db:

rails dbconsole

Teraz ręcznie usuń wersje z tabeli migracji:

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

Teraz powinieneś być dobry.


0

Właśnie miałem ten sam problem:

  1. rails d migracja fuu - to usuwa migrację z ostatnim znacznikiem czasu
  2. szyny d migracja fuu - to usunęło inną migrację
  3. użyj statusu git, aby sprawdzić, czy nie ma już nieśledzonych plików
  4. szyny g migracji fuu

To naprawiło to dla mnie


0

Uwaga boczna: Począwszy od rails 5.0.0 rakezostał zmieniony na rails Więc wykonaj następujące czynności

rails db: migrate VERSION = 0

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.