Jaki jest najłatwiejszy sposób na wyczyszczenie bazy danych z CLI za pomocą manage.py w Django?

84

Używam Django do tworzenia strony internetowej z MySQL. Teraz, gdy się uczę, muszę bardzo często zmieniać model, więc chcę, aby wszystkie tabele zostały wyczyszczone, a nowa tabela została utworzona.

Ale syncdbnie dotyka istniejących tabel. Czy jest lepszy sposób na rozwiązanie tego problemu?

Miraż
źródło

Odpowiedzi:

155

Jeśli nie dbasz o dane:

Najlepszym sposobem byłoby porzucenie bazy danych i syncdbponowne uruchomienie . Lub możesz biegać:

Dla Django> = 1.5

python manage.py flush

Dla Django <1.5

python manage.py reset appname

(możesz dodać --no-inputna końcu polecenia, aby pominąć interaktywny monit).

Jeśli zależy Ci na danych:

Z dokumentów:

syncdb utworzy tabele tylko dla modeli, które nie zostały jeszcze zainstalowane. Nigdy nie wyda instrukcji ALTER TABLE, aby dopasować zmiany wprowadzone w klasie modelu po instalacji. Zmiany w klasach modeli i schematach baz danych często wiążą się z pewną formą niejednoznaczności iw takich przypadkach Django musiałoby odgadnąć, jakie zmiany należy wprowadzić. Istnieje ryzyko, że w trakcie tego procesu zostaną utracone krytyczne dane.

Jeśli dokonałeś zmian w modelu i chcesz dopasować tabele bazy danych, użyj polecenia sql, aby wyświetlić nową strukturę SQL i porównaj ją z istniejącym schematem tabeli, aby ustalić zmiany.

https://docs.djangoproject.com/en/dev/ref/django-admin/

Źródła: FAQ - https://docs.djangoproject.com/en/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database

Ludzie polecają również South ( http://south.aeracode.org/docs/about.html#key-features ), ale ja tego nie próbowałem.

manojlds
źródło
4
Południe jest naprawdę dobre do automatycznej obsługi migracji. Trochę się do tego przyzwyczaisz, ale oszczędza to wiele kłopotów z upuszczaniem i odtwarzaniem baz danych podczas programowania i jest koniecznością, gdy Twoja witryna jest już aktywna i musisz zmienić strukturę bazy danych, gdy masz w niej cenne dane.
thepeer
11
RESETUJ POLECENIE WYCOFANE . W Django 1.5 polecenie zostało zaktualizowane do flush. spróbuj użyć python manage.py flushlub, python manage.py flush --noinputaby pominąć interaktywną podpowiedź.
agconti
South został wycofany . Zobacz tutaj . Link, który tu podałeś, jest uszkodzony.
Mukesh Sai Kumar
Wygląda na to, że polecenie jest teraz django-admin flushzgodne z dokumentacją
Todd
4

Korzystanie z rozszerzeń Django , uruchamianie:

./manage.py reset_db

Czyści tabele bazy danych, a następnie uruchomi:

./manage.py syncdb

Odtworzy je (południe może poprosić cię o migrację rzeczy).

mrmagooey
źródło
2
@becko wykonaj to najpierw: pip install django-extensions
FacePalm
4

Myślę, że dokumentacja Django wyraźnie wspomina, że ​​jeśli celem jest ponowne rozpoczęcie od pustej bazy danych (co wydaje się być intencją OP), po prostu upuść i ponownie utwórz bazę danych i uruchom ponownie migrate(zamiast używać flush):

Jeśli wolisz rozpocząć od pustej bazy danych i ponownie uruchomić wszystkie migracje, należy usunąć i ponownie utworzyć bazę danych, a następnie uruchomić migrację.

W przypadku OP wystarczy, że:

  1. Usuń bazę danych z MySQL
  2. Odtwórz bazę danych
  3. Biegać python manage.py migrate
Anupam
źródło
0

Najszybciej (porzuca i tworzy wszystkie tabele wraz z danymi):

./manage.py reset appname | ./manage.py dbshell

Uwaga:

  • Może nie działać poprawnie w systemie Windows.
  • Może zachować kilka starych tabel w bazie danych
Udi
źródło
3
resetjuż uruchamia SQL, więc nie ma potrzeby przesyłania do dbshell. Jeśli użyjesz sqlresetpolecenia, to po prostu wypisze SQL, który możesz przesłać potokiem do powłoki w celu wykonania, ale jest to niepotrzebny krok.
Michael Mior
0

Możesz użyć biblioteki Django-Truncate, aby usunąć wszystkie dane z tabeli bez niszczenia struktury tabeli.

Przykład:

  1. Najpierw zainstaluj django-turncate za pomocą terminala / wiersza poleceń:
pip install django-truncate
  1. Dodaj "django_truncate" do INSTALLED_APPS w settings.pypliku:
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. Użyj tego polecenia w terminalu, aby usunąć wszystkie dane tabeli z aplikacji.
python manage.py truncate --apps app_name --models table_name
Mahbub Ul Islam
źródło