Django 1.7 wprowadziło migracje baz danych .
Podczas uruchamiania testów jednostkowych w Django 1.7 wymusza migrację , która zajmuje dużo czasu. Chciałbym więc pominąć migracje django i stworzyć bazę danych w ostatecznym stanie.
Wiem, że ignorowanie migracji może być złą praktyką, ponieważ ta część kodu nie zostanie przetestowana. Ale tak nie jest: przeprowadzam pełne migracje na serwerze testowym CI (jenkins). Chcę tylko pominąć migracje w moich lokalnych testach, w których liczy się szybkość.
Pewien kontekst:
Aż do Django 1.6 , kiedy używałem South, używałem ustawienia SOUTH_TESTS_MIGRATE :
Domyślnie polecenie syncdb języka South również zastosuje migracje, jeśli jest uruchomione w trybie nieinteraktywnym, co obejmuje również przeprowadzanie testów - będzie uruchamiane przy każdej migracji za każdym razem, gdy uruchomisz testy.
Jeśli chcesz, aby moduł uruchamiający testy używał syncdb zamiast migracji - na przykład, jeśli migracja trwa zbyt długo - po prostu ustaw SOUTH_TESTS_MIGRATE = False w settings.py.
Jednak syncdb już nie istnieje, teraz jest migrowany .
I od Django 1.8 Użyję --keepdb parametr:
Opcji --keepdb można użyć do zachowania testowej bazy danych między przebiegami testów. Ma to tę zaletę, że pomija zarówno akcje tworzenia, jak i niszczenia, co znacznie skraca czas uruchamiania testów, szczególnie tych w dużym zestawie testów. Jeśli testowa baza danych nie istnieje, zostanie utworzona przy pierwszym uruchomieniu, a następnie zachowana przy każdym kolejnym uruchomieniu. Wszelkie niezastosowane migracje zostaną również zastosowane do testowej bazy danych przed uruchomieniem zestawu testów.
Więc to pytanie ogranicza się do Django 1.7.
źródło
django-test-without-migrations
Pakiet był bardzo przydatne dla mnie, może chcesz zmienić zaakceptowanej odpowiedzi stackoverflow.com/a/28993456/200224Odpowiedzi:
Spójrz na to obejście , opublikowane przez Berniego Sumption na liście mailingowej deweloperów Django:
W Django 1.9 sytuacja nieco się poprawiła i możesz ustawić wartość na
None
:MIGRATION_MODULES = {"myapp": brak}
źródło
myapp.migrations_not_used_in_tests
moduł nie powinien istnieć.Oto koniec mojego pliku ustawień:
na podstawie tego fragmentu
Migracje wyłączyłem tylko wtedy, gdy są uruchomione testy
źródło
__setitem__(self, *_)
metodę, ponieważ mieliśmy problem z aplikacjami, które ustawiały własną migrację, jaksettings.MIGRATION_MODULES['chroniker'] = 'db_migrations'
django-test-without-migrations dodaje
--nomigrations
flagę domanage.py test
. Działa jak marzenie.źródło
Aktualizacja : nieważne, ta zmiana została cofnięta przed wydaniem wersji 1.10. Miejmy nadzieję, że powróci w przyszłej wersji.
Należy zauważyć, że od wersji Django 1.10 można to kontrolować za pomocą ustawień testowej bazy danych.
źródło
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
źródło
Dla django 1.9 i nowszych odpowiedź Guillaume Vincent już nie działa, więc oto nowe rozwiązanie:
Używam tego fragmentu kodu w moim pliku ustawień, po definicji
INSTALLED_APPS
Iteruje po wszystkich zainstalowanych aplikacjach i oznacza każdą jako nie posiadającą modułu migracji. Więcej informacji można znaleźć w dokumentacji django .
Za pomocą tego fragmentu możesz uruchomić swoje testy, ustawiając zmienną środowiskową
TESTS_WITHOUT_MIGRATIONS
, np:źródło
Właśnie zastanawiam się, jak wyłączyć migracje po django 1.10, może to komuś pomoże. Tutaj jest link na git
Migracje dla django 1.10 składają się z dwóch części, spójrz na load_disk i rejestrator
Część
load_disk
modelu aplikacji dla migracji, która zostanie dodana wINSTALL_APP
I częśćrecorder
dla połączenia z bazą danych Dla wersji wcześniejszej niż 1.9 musimy ustawićMIGRATION_MODULES={'do.not.migrate':'notmigrations'}
kiedy uruchamiasz test Teraz musimy go ustawić Brak takMIGRATION_MODULES={'do.not.migrate':None}
Jeśli nie chcemy robić migracji dla żadnej aplikacji , po prostu przedłuż dyktando i wróćNone
pogetitem
funkcji, i zrób to samo wDATABASES
, to jest właściwa rzecz, którą musisz zrobićPS: W przypadku polecenia musisz określić
--setting=module.path.settings_test_snippet
potest
PPS Jeśli pracujesz zpycharm
, nie ustawiaj--settings
opcji naRun/Debug configurations
, po prostu dodaj ścieżkęsettings_test_snippet.py
w ustawieniach niestandardowych. Po prostu będzie dobrze !!cieszyć się
źródło