2010-05-16 7 views
24

Używam South na moim projekcie przez jakiś czas, ale ostatnio zrobiłem ogromną ilość pracy nad rozwojem i zmieniłem maszynę programistyczną i myślę, że coś zepsuło się w tym procesie. Projekt działa dobrze, ale nie mogę zastosować migracji. Ilekroć próbuję zastosować migracji pojawia się następujący traceback:Błąd migracji południowej: wyjątek NoMigrations dla django.contrib.auth

danpalmer:pest Dan$ python manage.py migrate frontend 
Traceback (most recent call last): 
    File "manage.py", line 11, in <module> 
    execute_manager(settings) 
    File "/Library/Python/2.6/site-packages/django/core/management/__init__.py", line 362, in execute_manager 
    utility.execute() 
    File "/Library/Python/2.6/site-packages/django/core/management/__init__.py", line 303, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Library/Python/2.6/site-packages/django/core/management/base.py", line 195, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/Library/Python/2.6/site-packages/django/core/management/base.py", line 222, in execute 
    output = self.handle(*args, **options) 
    File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/management/commands/migrate.py", line 102, in handle 
    delete_ghosts = delete_ghosts, 
    File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/__init__.py", line 182, in migrate_app 
    applied = check_migration_histories(applied, delete_ghosts) 
    File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/__init__.py", line 85, in check_migration_histories 
    m = h.get_migration() 
    File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/models.py", line 34, in get_migration 
    return self.get_migrations().migration(self.migration) 
    File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/models.py", line 31, in get_migrations 
    return Migrations(self.app_name) 
    File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/base.py", line 60, in __call__ 
    self.instances[app_label] = super(MigrationsMetaclass, self).__call__(app_label_to_app_module(app_label), **kwds) 
    File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/base.py", line 88, in __init__ 
    self.set_application(application, force_creation, verbose_creation) 
    File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/base.py", line 159, in set_application 
    raise exceptions.NoMigrations(application) 
south.exceptions.NoMigrations: Application '<module 'django.contrib.auth' from '/Library/Python/2.6/site-packages/django/contrib/auth/__init__.pyc'>' has no migrations. 

że nie jestem doświadczonym z południa i nie mam przed spotkał ten błąd. Jedyną pomocną rzeczą, jaką mogę znaleźć w Internecie na temat tego błędu, jest myślenie przed pre-0.7 i jestem na południu 0.7. Uruchomiłem "easy_install -U South", aby się upewnić.

+0

Czy syncdb pierwszy raz, aby zapewnić tabele southmigrationhistory tam? Lub czy importujesz zrzut danych podczas przenoszenia maszyny? –

+0

Ponadto django.contrib.auth nie powinien używać migracji (chyba, że ​​robisz coś, aby włamać się samemu). Czy ręcznie utworzono katalog migracji dla pliku contrib.auth? –

+0

Zrobiłem syncdb na początek. Baza danych jest tą samą bazą danych, co ja używam bazy danych SQLite do programowania. W drugim punkcie zobacz moje rozwiązanie poniżej. – danpalmer

Odpowiedz

26

Rozwiązałem problem.

Oczywiście, nie możesz używać South'a do migracji dla aplikacji będących częścią Django, takich jak 'auth', więc nie wiedziałem, dlaczego próbowałem.

Zdałem sobie sprawę, że przez jakiś czas miałem inną aplikację w ramach mojego projektu o nazwie auth. Musiałem próbować przenieść to w pewnym momencie przed zmianą nazwy i dlatego wszystko to zepsułem.

Usunąłem wpisy historii migracji z bazy danych dla tej aplikacji i wszystko było w porządku.

+0

Miałem ten sam problem, ale z aplikacją komentarzy. dzięki. – zerofuxor

+0

Zrobiłem to samo z aplikacją wiadomości właśnie dzisiaj. – Jyrsa

+1

Możesz używać South dla aplikacji, które są częścią Django jak auth i czasami ma to sens. Zobacz moją odpowiedź poniżej. Nie jestem pewien, co zrobić, gdy zaakceptowana odpowiedź nie jest poprawna. Może możesz edytować swoją odpowiedź, aby zawierała poprawną odpowiedź? – mrooney

43

Pozostawiając to tutaj dla przyszłych Googlersami

Niedawno uruchomiony na ten wyjątkami z jednym z moich własnych aplikacji dzisiaj, nie w jednym contrib.

Po nieco głowy drapania Zauważyłem, że w jakiś sposób plik ...

app/migrations/__init__.py 

... zostały usunięte, co oznacza, pyton mogę zaimportować dir jako moduł itp itd

+2

Tak. Pracował jak urok. – mlissner

+2

Dzięki, pomógł mi też. – akozin

+2

Dla mnie był niespójny stan między zarejestrowanymi migracjami do bazy danych i usunięciem katalogu 'migrations'. Dodanie 'migrations' i jego' __init __. Py' rozwiązało problem. – gipi

1

Miałem również ten sam problem, jednak stało się to z aplikacją root. Odkryłem, że było to spowodowane pustym models.py w katalogu głównym mojego projektu z wcześniejszego rozwoju. Podejrzewam, że ten problem może powstać również w przypadku aplikacji projektowych.

1

Można wykonywać migracje na wbudowanych modułach i ma to sens w przypadku migracji danych, na przykład obcięcia wszystkich nazw użytkowników, usuwania nieprawidłowych wiadomości e-mail itp.

W przypadku użytkownika z django.contrib.auth.models, wystarczy użyć: orm [ „auth.User”]

5

miałem również ten sam problem, a na końcu naprawiłem to przez usunięcie wszystkie wiersze z tabeli south_migrationhistory i uruchom następującą komendę z terminala.

python manage.py reset south 

Ten answer wyjaśnić o tym, jak zresetować południowo historię migracji.

Edit:

Od Django 1,5 roku komenda reset nie będzie działać. Zamiast tego musisz użyć flush.

Aby lepiej zrozumieć, co przeczytasz, przeczytasz ten stackoverflow answer.

+1

Uwaga Polecenie "reset" zostało zastąpione przez "flush" w Django 1.5, chociaż flush nie działa z poszczególnymi tabelami. Aby to zrobić, musisz użyć tego portu starego resetowania: https://github.com/gregmuellegger/django-reset – shacker

0

Mam ten sam błąd, ale nie dla modułu django, ale dla modułu, który był częścią mojego virtualenv. Nie rozumiem, jak można było przeprowadzić migrację na południe dla tego modułu, ponieważ tak naprawdę nie było żadnych migracji. Potem przypomniałem sobie, że skopiowałem bazę danych z testu, który miał być taki sam. Okazało się jednak, że inny env miał nieco odmienną wersję modułu, która została poddana migracji. Skończyło się na tym, że usunięto nieprawidłowy wiersz z historii migracji południowej (ponieważ i tak był to testowy env).

10

po prostu wpadł na to po swithcing gałęzie i wersje aplikacji i postanowił usunąć aplikację, która teraz miała żadnych migracje z south_migrationhistory tabeli

./manage.py dbshell 

mysql> SELECT * FROM south_migrationhistory WHERE app_name = 'social_auth'; 

104 | social_auth | 0001_initial...                 
105 | social_auth | 0002_auto__add_unique_nonce... 


mysql> DELETE FROM south_migrationhistory WHERE app_name = 'social_auth'; 
Query OK, 2 rows affected (0.00 sec) 
+0

Jest to również szybka poprawka, gdy chcesz usunąć tylko pojedyncze migracje aplikacji zamiast reseting/spłukiwanie całego południa. – andyzinsser

+0

Niesamowite, to rozwiązało mój problem, chociaż nie jestem PO Hehe Cheers – NeoVe

0

miałem podobny problem z django.contrib.admin nie pozwalając mi uruchomić moje migracje. Rozwiązałem go, wyłączając django.contrib.admin w settings.INSTALLED_APPS

Powiązane problemy