2015-08-05 10 views
12

Obecnie śledzę poradnik ruby ​​on rails: http://guides.rubyonrails.org/getting_started.html.Szyny: Jak usunąć oczekującą migrację

Próbuję zapisać dane w bazie danych. Jednak, gdy biegnę: rails server pojawia się następujący błąd:

Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development 

Szukałem w innych artykułach i kiedy biegnę:

bin/rake db:migrate 

dostaję rake aborted!

Po uruchomieniu :

rake db:abort_if_pending_migrations.... 

widzę, że:

You have 1 pending migration: 
20150805200129 CreateDatabases 

SQLite3::SQLException: table "databases" already exists: 

i po prostu mówi mi, aby uruchomić prowizję db: migracja, aby zacząć od nowa.

wygląda na to, że już istnieje, czy istnieje sposób na anulowanie oczekującej migracji?

+0

Twój czeka migracja próbuje stworzyć 'databases' stół, który już istnieje ... –

Odpowiedz

6

Twoja migracja mogła zakończyć się niepowodzeniem w połowie (tak więc została utworzona tabela, ale nie została zakończona).

Jesteś po prostu przy użyciu środowiska programistycznego, więc jest w porządku po prostu upuść bazę danych i odbudować od podstaw:

rake db:drop 
rake db:create 
rake db:migrate 
+4

myślę, że jest niebezpieczne, aby założyć, że jest w porządku, aby usunąć bazę rozwojową. Widziałem dbs rozwoju, które zajmuje trochę czasu, aby przywrócić. – spickermann

+0

co było tak trudnego w przywróceniu go? cóż, możesz użyć 'rake db: schema: load' zamiast' db: migrate', jeśli masz jakieś migracje legacy, które już nie działają – EugZol

+0

To zadziałało! Dzięki za wgląd! I @spickermann masz rację, na szczęście można go zastąpić w ciągu kilku sekund jako rzeczy na pierwszym poziomie. –

9

Czasami nawet upuszczenie rozwoju lokalnej bazy danych nie jest dobrym pomysłem. Istnieją lepsze sposoby na usunięcie/zniszczenie konkretnej migracji w aplikacji Rails.

Można użyć polecenia rails d migration zniszczyć konkretnej migracji:

rails d migration MigrationName 

Aby cofnąć zmiany odpowiadające konkretnej migracji, można użyć db:migrate:down metodę tak:

rake db:migrate:down VERSION=XXX 

czasami rzeczy może być bardziej niechlujny iw tej sytuacji innym przydatnym rozwiązaniem jest przejrzenie tabeli schema_migrations w bazie danych, która zawiera wszystkie migracje z ich version zapisanymi w to.

Można usunąć konkretny migrację z tej tabeli tak:

delete from schema_migrations WHERE version = VERSION; 

jeśli nie chce, że migracja już być obecny.

+0

Warto wspomnieć, że można całkowicie uniknąć tego problemu, używając odpowiedniego RDBMS z transakcjami DDL, takimi jak Postgres. – EugZol

-1

Jeśli chcesz przywrócić niewłaściwych migracje, można usunąć cały db używając tego:

rake db:drop 

Następnie wyjąć migracje plik ręcznie (To przyzwyczajenie uszkodzony db kiedy odtworzyć jako migracje schematu byłoby również odpadły).

Następnie uruchom

rake db:migrate 

A jeśli nie ma danych, aby być rozstawiony, a następnie uruchomić ten również

rake db:setup 
+0

Dziękuję za twój wkład! –

1

Jeśli jesteś podobny do mnie i utrzymać struktury bazy danych poza Rails, można po prostu usuń plik migracji z db/migration. Dostałem błąd w pytaniu OP, gdy użyłem polecenia rails generate, aby utworzyć klasę modelu, zapominając, że tworzy ona również plik migracji.

Nie używaj tej metody, jeśli polegasz na Railsach w celu zachowania struktury bazy danych!

Trzymam moja konstrukcja szyn złożyć aktualne budując go z bazy danych przy użyciu:

bundle exec rake db:structure:dump 
+0

Świetny wgląd, dziękuję! –

Powiązane problemy