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ę?

alvincrespo
źródło

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

Fábio Batista
źródło
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

Gediminas
źródło
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ć)

lis
źródło
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.

Vicky
źródło
9

Możemy użyć,

$ rails d migration table_name  

Co spowoduje usunięcie migracji.

Agnieszka
źródło
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.

frenesim
źródło
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 
random_user_0891
źródło
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.

stackPusher
źródło
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

Miguel Alatorre
źródło
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

Mohamed Daw
źródło