Jak mówi tytuł, wydaje mi się, że nie mogę uruchomić migracji.
Aplikacja była pierwotnie poniżej 1.6, więc rozumiem, że początkowo migracji tam nie będzie, a jeśli uruchomię python manage.py migrate
, otrzymam:
Operations to perform:
Synchronize unmigrated apps: myapp
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Installing custom SQL...
Installing indexes...
Running migrations:
No migrations to apply.
Jeśli wprowadzę zmiany w jakimkolwiek modelu w programie myapp
, nadal będzie wyświetlany komunikat „nie migrowano”, zgodnie z oczekiwaniami.
Ale jeśli biegnę python manage.py makemigrations myapp
, dostaję:
No changes detected in app 'myapp'
Wydaje się, że nie ma znaczenia, co ani jak uruchomię polecenie, nigdy nie wykrywa zmiany w aplikacji ani nie dodaje żadnych plików migracji do aplikacji.
Czy jest jakiś sposób, aby zmusić aplikację do migracji i powiedzieć „To jest moja baza do pracy” lub cokolwiek? A może coś mi brakuje?
Moja baza danych jest PostgreSQL, jeśli to w ogóle pomaga.
źródło
Odpowiedzi:
Jeśli przechodzisz z istniejącej aplikacji, którą stworzyłeś w django 1.6, musisz wykonać jeden krok wstępny (jak się dowiedziałem) wymieniony w dokumentacji:
Dokumentacja nie wyjaśnia, że musisz dodać etykietę aplikacji do polecenia, ponieważ pierwszą rzeczą, którą nakazuje, jest to,
python manage.py makemigrations
co się nie powiedzie. Początkowa migracja jest wykonywana podczas tworzenia aplikacji w wersji 1.7, ale gdybyś pochodził z wersji 1.6, nie zostałaby przeprowadzona. Aby uzyskać więcej informacji, zobacz „Dodawanie migracji do aplikacji” w dokumentacji.źródło
python manage.py makemigrations APP_LABEL
dla każdego?./manage.py startapp
, ale nadal musiałem wyraźnie wspomnieć o etykiecieMoże się to zdarzyć z następujących powodów:
INSTALLED_APPS
liście wsettings.py
(musisz dodać nazwę aplikacji lub kropkowaną ścieżkę do podklasy AppConfig w apps.py w folderze aplikacji, w zależności od używanej wersji django). Zapoznaj się z dokumentacją: INSTALLED_APPSmigrations
folderu w tych aplikacjach. (Rozwiązanie: po prostu utwórz ten folder).__init__.py
pliku wmigrations
folderze tych aplikacji. (Rozwiązanie: po prostu utwórz pusty plik o nazwie __init__.py )__init__.py
pliku w folderze aplikacji. (Rozwiązanie: po prostu utwórz pusty plik o nazwie __init__.py )models.py
pliku w aplikacjimodels.py
nie dziedziczydjango.db.models.Model
models.py
Uwaga: częstym błędem jest dodawanie
migrations
folderu w.gitignore
pliku. Po sklonowaniu ze zdalnego repozytorium w lokalnym repozytorium nie będzie brakowaćmigrations
folderu i / lub__init__.py
plików. To powoduje problem.Proponuję pliki migracji gitignore, dodając następujące wiersze do
.gitignore
plikuźródło
__init__.py
folder wraz z migracjami.You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py)
.gitignore
__init__.py
jest wymagany w katalogu, aby był traktowany jako pakiet Pythona. zobacz toOk, wygląda na to, że przegapiłem oczywisty krok, ale publikowanie tego na wypadek, gdyby ktoś inny zrobił to samo.
Po aktualizacji do wersji 1.7 moje modele stały się niezarządzane (
managed = False
) - miałem je jakTrue
poprzednio, ale wygląda na to, że zostały przywrócone.Usunięcie tego wiersza (To default na True) i
makemigrations
natychmiastowe uruchomienie spowodowało, że moduł migracji i teraz działa.makemigrations
nie będzie działać na niezarządzanych tabelach (co jest oczywiste z perspektywy czasu)źródło
manage.py inspectdb
dodaje manage = False! jeśli importujesz starsze bazy danych, musisz je ostrożnie dostroić!app_label
taki samMoje rozwiązanie nie zostało tutaj uwzględnione, więc je publikuję. Używałem go
syncdb
do projektu - tylko po to, aby go uruchomić. Potem, kiedy próbowałem zacząć używać migracji Django, najpierw je sfałszował, a potem powiedział, że jest OK, ale nic się nie dzieje z bazą danych.Moim rozwiązaniem było po prostu usunięcie wszystkich plików migracji dla mojej aplikacji, a także rekordów bazy danych dotyczących migracji aplikacji w
django_migrations
tabeli.Potem właśnie wykonałem wstępną migrację z:
./manage.py makemigrations my_app
śledzony przez:
./manage.py migrate my_app
Teraz mogę bez problemu dokonywać migracji.
źródło
__init.py__
, to nie zadziała.Zgadzam się z @furins. Jeśli wydaje się, że wszystko jest w porządku, a mimo to pojawia się ten problem, sprawdź, czy istnieje metoda właściwości o tym samym tytule, co atrybut, który próbujesz dodać w klasie Model.
źródło
Jest to trochę głupi błąd do popełnienia, ale dodatkowy przecinek na końcu wiersza deklaracji pola w klasie modelu sprawia, że wiersz nie ma żadnego efektu.
Dzieje się tak, gdy kopiujesz, wklejasz plik def. z migracji, która sama jest zdefiniowana jako tablica.
Choć może to komuś pomogło :-)
źródło
Może spóźniłem się, ale czy próbowałeś mieć
migrations
folder w swojej aplikacji z__init__.py
plikiem?źródło
Może to komuś pomoże. Używałem aplikacji zagnieżdżonej. project.appname i faktycznie miałem projekt i project.appname w INSTALLED_APPS. Usunięcie projektu z INSTALLED_APPS umożliwiło wykrycie zmian.
źródło
Odpowiedź znajduje się w tym poście o przepełnieniu stosu, opublikowanym przez cdvv7788 Migrations in Django 1.7
Miałem dokładnie ten sam problem i wykonanie powyższego zadziałało idealnie.
Przeniosłem moją aplikację django do cloud9 iz jakiegoś powodu nigdy nie złapałem początkowej migracji.
źródło
Pracowały dla mnie następujące:
Pracowało dla mnie: Python 3.4, Django 1.10
źródło
Osoby takie jak ja, które nie lubią migracji, mogą skorzystać z poniższych kroków.
python manage.py makemigrations app_label
do początkowej migracji.python manage.py migrate
do tworzenia tabel przed wprowadzeniem zmian.Jeśli pomylisz którykolwiek z tych kroków, przeczytaj pliki migracji. Zmień je, aby poprawić swój schemat lub usunąć niechciane pliki, ale nie zapomnij zmienić części zależności następnego pliku migracji;)
Mam nadzieję, że to pomoże komuś w przyszłości.
źródło
Chcesz sprawdzić
settings.py
wINSTALLED_APPS
wykazie i sprawdzić, czy wszystkie aplikacje z modeli są wymienione tam.Uruchomienie
makemigrations
w folderze projektu oznacza, że będzie szukał aktualizacji wszystkich tabel związanych ze wszystkimi aplikacjami zawartymi wsettings.py
projekcie. Po dołączeniumakemigrations
automatycznie dołączy aplikację (oszczędza to dużo pracy, więc nie musisz uruchamiaćmakemigrations app_name
dla każdej aplikacji w projekcie / witrynie).źródło
Na wszelki wypadek, gdybyś miał określone pole, które nie jest identyfikowane przez makemigracje: sprawdź dwukrotnie, czy masz właściwość o tej samej nazwie.
przykład:
właściwość „nadpisze” definicję pola, więc zmiany nie zostaną zidentyfikowane przez
makemigrations
źródło
hourly_rate = models.DecimalField
(pomijając końcowy znak „()”) i po prostu cicho się nie udało.Upewnij się, że Twój model nie jest
abstract
. Właściwie popełniłem ten błąd i zajęło to trochę czasu, więc pomyślałem, że opublikuję go.źródło
Dodanie tej odpowiedzi bo pomogła mi tylko ta metoda.
Usunąłem
migrations
folder runmakemigrations
imigrate
.Nadal brzmiał: Brak migracji do zastosowania.
Poszedłem do
migrate
folderu i otworzyłem ostatnio utworzony plik,skomentowałem migrację, którą chciałem (została tam wykryta i wprowadzona)
i uruchomiłem
migrate
ponownie.To po prostu ręczna edycja pliku migracji.
Zrób to tylko wtedy, gdy rozumiesz zawartość pliku.
źródło
Czy używałeś
schemamigration my_app --initial
po zmianie nazwy starego folderu migracji? Spróbuj. Może działać. Jeśli nie - spróbuj odtworzyć bazę danych i wykonaj synchronizację + migrację. U mnie zadziałało ...źródło
schemamigration
istnieje żadne polecenie - myślę, że to część południa? Obecnie w ogóle nie mam folderu migracji. Usunięciemodels.py
i ponowne uruchomienieinspectdb
nie wydawało się nic zrobić.schemamigration
był z południa.makemigrations
jest jego zamiennikiem.makemigrations --empty
Miałem ten sam problem. Upewnij się, że niezależnie od klas, które zdefiniowałeś w models.py, musisz dziedziczyć modeles.Model class.
źródło
Miałem ten sam problem z koniecznością dwukrotnego przeprowadzania makemigracji i wszelkiego rodzaju dziwnych zachowań. Okazało się, że przyczyną problemu było to, że korzystałem z funkcji ustawiania domyślnych dat w moich modelach, więc migracje wykrywały zmianę za każdym razem, gdy wykonywałem makemigracje. Odpowiedź na to pytanie postawiła mnie na właściwej drodze: unikaj makemigracji, aby ponownie utworzyć pole daty
źródło
Niedawno zaktualizowałem Django z wersji 1.6 do 1.8 i miałem dla nich kilka aplikacji i migracji. Użyłem południe i
schemamigrations
do tworzenia migracji w Django 1.6, które zostało usunięte w Django 1.8.Kiedy dodałem nowe modele po aktualizacji,
makemigrations
polecenie nie wykryło żadnych zmian. A potem wypróbowałem rozwiązanie sugerowane przez @drojf (pierwsza odpowiedź), działało dobrze, ale nie udało mi się zastosować fałszywej migracji początkowej (python manage.py --fake-initial
). Robiłem to, ponieważ moje tabele (stare tabele) były już utworzone.W końcu zadziałało to dla mnie, usunęło nowe modele (lub zmiany modelu) z models.py, a następnie musiałem usunąć (lub zmienić nazwę dla bezpiecznej kopii zapasowej) folder migracji wszystkich aplikacji i uruchomić
manage.py
makemigracje Pythona dla wszystkich aplikacji, a następnie tak się stałopython manage.py migrate --fake-initial
. To zadziałało jak urok. Po utworzeniu początkowej migracji dla wszystkich aplikacji i fałszywej wstępnej migracji, następnie dodano nowe modele i postępowano zgodnie z regularnym procesemmakemigrations
i migracją do tej aplikacji. Zmiany zostały wykryte teraz i wszystko poszło dobrze.Pomyślałem o udostępnieniu go tutaj, jeśli ktoś napotka ten sam problem (posiadanie
schemamigrations
południa dla swoich aplikacji), może mu to pomóc :)źródło
Może to komuś pomoże, miałem ten sam problem.
Utworzyłem już dwie tabele z klasą serializatora i widokami. Więc kiedy chciałem zaktualizować, miałem ten błąd.
Wykonałem następujące kroki:
.\manage.py makemigrations app
.\manage.py migrate
models.py
1
i2
.models.py
5
.Jeśli pracujesz z Pycharm, lokalna historia jest bardzo pomocna.
źródło
Może to komuś pomoże.
Usunąłem moje
models.py
i spodziewałemmakemigrations
się stworzyćDeleteModel
zestawienia.Pamiętaj, aby usunąć
*.pyc
pliki!źródło
Migracje śledzą zmiany w DB, więc jeśli zmieniasz się z niezarządzanego na zarządzany, musisz upewnić się, że twoja tabela bazy danych jest aktualna w odniesieniu do modelu, z którym masz do czynienia.
Jeśli nadal jesteś w trybie deweloperskim, osobiście zdecydowałem się usunąć pliki migracji w moim IDE, a także w tabeli django_migrations związanej z moim modelem i ponownie uruchomić powyższe polecenie.
PAMIĘTAJ: jeśli masz migrację, która kończy się na _001 w twoim IDE i _003 w twojej bazie danych. Django zobaczy tylko, czy masz migrację kończącą się na _004, aby cokolwiek zaktualizować.
Te 2 (migracje kodu i bazy danych) są połączone i działają w tandemie.
Miłego kodowania.
źródło
źródło
Dodałem tę odpowiedź, ponieważ żadna z innych dostępnych powyżej nie działała dla mnie.
W moim przypadku działo się coś jeszcze bardziej dziwnego ( wersja Django 1.7 ), w moim models.py miałem „dodatkową” linię na końcu mojego pliku (była to pusta linia) i kiedy wykonałem
python manage.py makemigrations
polecenie, wynik był taki: „nie wykryto żadnych zmian”.Aby to naprawić, usunąłem tę „pustą linię”, która znajdowała się na końcu mojego pliku models.py i ponownie uruchomiłem polecenie, wszystko zostało naprawione i wykryto wszystkie zmiany wprowadzone w models.py !
źródło
Może być konieczne sfałszowanie początkowych migracji za pomocą poniższego polecenia
źródło
Po pierwsze to rozwiązanie ma zastosowanie do tych, którzy mają ten sam problem podczas wdrażania na serwerze heroku, ja miałem ten sam problem.
Aby wdrożyć, jest obowiązkowy krok, który polega na dodaniu django_heroku.settings (locals ()) w pliku settings.py.
Zmiany: Kiedy zmieniłem powyższą linię na django_heroku.settings (locals (), databases = False), działało bezbłędnie.
źródło
W moim przypadku musiałem dodać mój model do pliku _ init _.py w folderze models, w którym został zdefiniowany mój model:
źródło
Dodanie mojego 2c, ponieważ żadne z tych rozwiązań nie zadziałało, ale to ...
Właśnie uruchomiłem
manage.py squashmigrations
i usunąłem stare migracje (zarówno pliki, jak i wiersze w tabeli bazy danych django.migrations).To pozostawiło taką linię w ostatnim pliku migracji:
To najwyraźniej zdezorientowało Django i spowodowało dziwne zachowanie: uruchomienie
manage.py makemigrations my_app
odtworzyłoby początkową migrację, tak jakby żadna nie istniała. Usunięciereplaces...
linki rozwiązało problem!źródło
python manage.py makemigrations accounts Migracje dla 'accounts': accounts \ migrations \ 0001_initial.py - Utwórz model Klient - Utwórz model Tag - Utwórz model Produkt - Utwórz model Zamówienie
Uwaga: tutaj „konta” to nazwa mojej aplikacji
źródło