2013-02-19 5 views
11

background: Po dodaniu djangoratings do mojego projektu, Próbowałem uruchomionybłąd migrują na południe - relacja istnieje już

django-admin.py schemamigration djangoratings --initial 
--settings=myapp.settings.local 

co zaowocowało nieznanego błędu dowodzenia schemamigration. Próbowałem rozwiązać ten błąd, dodając mój katalog projektu do PYTHONPATH (używam virtualenv i virtualenvwrapper). Rozwiązało to nieznany błąd polecenia dla schemamigration, ale myślę, że określiłem jeden katalog nad katalogiem projektu dla PYTHONPATH i kiedy została przeprowadzona początkowa migracja dla djangoratings, to skarżyło się na coś związanego z whoosh (którego używam w moim projekcie). Zmieniłem katalog PYTHONPATH i ponownie próbowałem ponownie uruchomić

django-admin.py schemamigration djangoratings --initial 
--settings=myapp.settings.local 
. Następnie uruchomiłem polecenie migracji. To kiedy otrzymałem błąd:

django.db.utils.DatabaseError: relation "djangoratings_vote" already exists 

próbowałem migrowania całą drogę z powrotem przy użyciu: znowu

django-admin.py migrate djangoratings zero --settings=myapp.settings.local 
Running migrations for djangoratings: 
- Migrating backwards to zero state. 
< djangoratings:0006_add_cookies 
< djangoratings:0005_add_exclusions 
< djangoratings:0004_rethink_recommendations 
< djangoratings:0003_add_correlations 
< djangoratings:0002_add_mean_and_stddev 
< djangoratings:0001_initial 

a następnie uruchomiony --initial, ale ten sam błąd wystąpił po wykonaniu polecenia wykonania migracji.

Spojrzałem na listę tabel w mojej bazie danych i nie widziałem żadnych dla djangoratings_vote.

Moje obecne migracje witryny djangoratings jest następujący:

0001_initial.py     0006_add_cookies.py 
0001_initial.pyc     0006_add_cookies.pyc 
0002_add_mean_and_stddev.py  0007_initial.py 
0002_add_mean_and_stddev.pyc  0007_initial.pyc 
0003_add_correlations.py   0008_initial.py 
0003_add_correlations.pyc   0008_initial.pyc 
0004_rethink_recommendations.py 0009_initial.py 
0004_rethink_recommendations.pyc 0009_initial.pyc 
0005_add_exclusions.py   __init__.py 
0005_add_exclusions.pyc   __init__.pyc 

Jak mogę rozwiązać relację „djangoratings_vote” już istnieje błąd? Najlepiej korzystać z South?

Odpowiedz

13

To brzmi dla mnie tak, jakby Południe nie było zsynchronizowane z twoją bazą danych (może się to zdarzyć, jeśli południe zaczęło tworzyć tabele, ale potem zawiedzie, nie będąc w stanie ukończyć migracji wstecznej). Polecam ręcznego przywracania bazy danych i południe następująco (wziąć kopię zapasową swojej db pierwszy w przypadku błędu):

  1. Usuń wszystkie djangoratings_ * tabel z bazy danych.
  2. Otwórz tabelę south_migrationhistory w bazie danych i filtruj według nazwy aplikacji. Usuń wszystkie wpisy dotyczące djangoratings.
  3. Usuń wszystkie pliki migracji w katalogu djangoratings/migrations.

Gdy to zrobisz, powinieneś mieć czystą bazę danych i historię południową. W tym momencie uruchom ponownie:

./manage.py schemamigration djangoratings --initial 

Który wygeneruje pojedynczy plik migracji. Następnie:

./manage.py migrate djangoratings. 

Zakładając, że nie dostaniesz błędy, które trzeba było po raz pierwszy, to powinien skonfigurować bazę danych, dzięki czemu są gotowe do użycia ocen Django.

+1

Dzięki! Byłem w stanie wykonać polecenie migracji bez żadnych problemów. Nie miałem żadnych tabel djangoratings lub djangoratings w DB, więc po prostu musiałem usunąć moje pliki migracji. – Derek

+0

Nie ma problemu, cieszę się, że zadziałało. –

+0

Mam dokładnie ten sam problem, ale na świeżo utworzonej bazie danych. Próbowałem usunąć migracje, wyczyścić bazę danych i ponownie zainstalować na południe, ale nic się nie zmieniło, żadnych pomysłów, jak to naprawić? – SuburbanFilth

23

istnieje lepszy sposób na rozwiązanie go:

python manage.py migrate djangoratings --fake 

, a następnie:

python manage.py migrate 
+2

Działa to również w Django 1.8 bez południa – aralar

1

Jest to przedłużenie odpowiedź @ stef_huayue, jeśli to nie dość działa zgodnie z oczekiwaniami.

Dowiedz się, która migracja nie powiodła się. Najważniejszym plikiem migracja_plik.py będzie zazwyczaj miejsce operacji migrations.AddField. Następnie uruchom: python manage.py migrate app_name --fake [migration_file]

bez rozszerzenia pliku. Obserwowani przez:

python manage.py migrate app_name