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


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 .


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 ).

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

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.


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.


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


0

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.