django syncdb i zaktualizowany model

86

Niedawno zaktualizowałem swój model, dodałem do niego BooleanField, ale kiedy to zrobię python manage.py syncdb, nie dodaje nowego pola do bazy danych dla modelu. Jak mogę to naprawić?

Hellnar
źródło
17
Fakt, że Django nie obsługuje tak fundamentalnej rzeczy po wyjęciu z pudełka, powstrzymał mnie przed użyciem go do tworzenia modeli w ogóle. Fakt, że uważają ORM, który obsługuje tworzenie tabeli, ale nie (lokalną) modyfikację tabeli, za jakość wydania, prawie uniemożliwił mi całkowite użycie Django.
Glenn Maynard
3
Fakt, że Django pozwala na tak świetne podłączanie aplikacji, czyni Django niesamowitym, a jego brak wbudowanej obsługi modyfikacji tabel jest w zasadzie nieistotny. Jak trudna jest instalacja aplikacji?
Dominic Rodger
@Glenn, zaplanuj poprawnie swoje modele na etapie projektowania, a nie będziesz mieć tego problemu. Jeśli dodajesz nowe funkcje, użyj pakietu migracyjnego, takiego jak South. Migracje lokalne są często skomplikowane; i tak jest zbyt skomplikowane dla prostej komendy zarządzającej Django.
Soviut

Odpowiedzi:

100

Od Django 1.7

Django ma wbudowaną obsługę migracji - zajrzyj do dokumentacji .

Dla Django 1.6 i wcześniejszych

Django nie obsługuje migracji po wyjęciu z pudełka. Istnieje jednak podłączalna aplikacja dla Django, która robi dokładnie to i działa świetnie. Nazywa się South .

Dominic Rodger
źródło
1
Uwaga: miałem problem z używaniem South do migracji modeli z niestandardowym zapleczem db (takim jak django-mssql)
Don
1
Południe jest bardzo ładne! Dzięki za wskazówkę
Julien Greard
14

Obecnie Django nie robi tego automatycznie. Twoje opcje to:

  1. Usuń tabelę z bazy danych, a następnie utwórz ją ponownie w nowej formie przy użyciu syncdb.
  2. Wydrukuj SQL dla bazy danych za pomocą python manage.py sql (appname), znajdź dodany wiersz dla pola i dodaj go ręcznie za pomocą alter tablepolecenia SQL. (Umożliwi to również wybranie wartości pola dla bieżących rekordów).
  3. Użyj południa (zgodnie z odpowiedzią Dominika ).
che
źródło
11

Wykonaj następujące kroki:

  1. Wyeksportuj dane do urządzenia za pomocą polecenia zarządzania dumpdata
  2. Opuść stół
  3. Uruchom syncdb
  4. Załaduj ponownie dane z urządzenia za pomocą polecenia zarządzania loaddata
Soviut
źródło
Całkowicie upuść i przeładuj coś, co powinno być zrobione na miejscu? To straszne.
Glenn Maynard
3
To proste polecenie zarządzania, a nie pakiet migracji! Django nie jest w stanie przewidzieć, jak zmieniły się twoje dane ani jak je zachować, więc nalega, abyś zrobił to sam. Jeśli ci się to nie podoba, użyj narzędzia migracji, takiego jak South.
Soviut
8

Jak zasugerowano w pierwszej odpowiedzi, spróbowałem użyć South i po godzinie frustracji z powodu niejasnych błędów migracji zdecydowałem się zamiast tego wybrać Django Evolution .

Myślę, że łatwiej jest zacząć od South i działało idealnie, gdy pierwszy raz pisałem ./manage.py evolve --hint --execute, więc jestem z niego zadowolony.

Dan Abramov
źródło
7
Po prawie roku używania Django Evolution i South zmieniam zdanie. Południe jest niesamowite. Ale jest bardzo podobny do Gita w tym sensie, że musisz upewnić się, że naprawdę rozumiesz, jak to działa . Jeśli piszesz polecenia na ślepo, najprawdopodobniej spieprzysz, gdy po raz pierwszy Ty lub ktoś z Twojego zespołu popełnia błąd.
Dan Abramov
2

Havent używał django od jakiegoś czasu, ale wydaje mi się, że pamiętam, że syncdb wykonuje zmiany poleceń w tabelach db. musisz upuścić tabelę, a następnie uruchomić ją ponownie i utworzy ponownie.

edycja: przepraszam NIE wprowadza zmian.

Alex H.
źródło
Wtedy nie uruchamia alter tablepoleceń, tylko uruchamia create tablepolecenia.
Dominic Rodger
cóż, mam dane w bazie danych, więc byłoby wspaniale, gdybym pokonał ten problem bez upuszczania.
Hellnar
1
Myślę, że chciałeś powiedzieć, że syncdb NIE wykonuje poleceń alter. Nie musisz usuwać tabeli, możesz ręcznie dodać nowe pole do swojego sql.
Odif Yltsaeb
tak, ale pytanie dotyczyło użycia syncdb, więc w tym przypadku musisz porzucić tabelę, aby użyć syncdb lub użyć wtyczki wymienionej poniżej.
Alex H
1
Jeśli jesteś sfrustrowany South, wypróbuj Django Evolution. Dobrze mi wyszło. stackoverflow.com/questions/1605662/…
Dan Abramov
1

W django 1.6

  • Najpierw biegaliśmy - python manage.py sql <app name>

  • Wtedy musimy biec - python manage.py syncdb

Monwara Hossain Munni
źródło
0

Jeśli uruchamiasz Django z Apache i MySQL, zrestartuj Apache po wykonaniu migracji z makemigrations .

Felipe Perry
źródło