2015-09-26 9 views
5

Używam Flask-Migrate (Alembic) do aktualizowania mojej bazy danych. Zaktualizowałem plik models.py, jednak popełniłem błąd. Pobiegłem migrację i udał się do uaktualnienia bazy danych, jednak mam ten błąd:Nie można migrować ani aktualizować bazy danych za pomocą Flask-Migrate (Alembic)

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u'\nCREATE TABLE topics (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\t`subjectID` INTEGER, \n\ttopic VARCHAR(150) NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(`subjectID`) REFERENCES subjects (id)\n)\n\n'] 

co zrobiłem było mieć db.Text zamiast db.Integer dla klucza obcego.

Kiedy próbuję uruchomić nową migrację uzyskać to:

alembic.util.CommandError: Target database is not up to date. 

Więc teraz utknąłem. Nie mogę zaktualizować bazy danych ani przeprowadzić migracji. Próbowałem downgrade do starszej wersji bazy danych za pomocą czegoś takiego:

python manage.py db downgrade --sql b877018671c:36949b1cca31 

Ale kiedy biegnę python manage.py db current uzyskać najnowszą wersję bazy danych, której siedzę w

Czy istnieje poprawka do tego.? Dzięki.

+0

Wygląda na to, że masz migrację (tę złą), której jeszcze nie uruchomiłeś. Zmodyfikuj go jako poprawny lub usuń i ponownie wygeneruj migrację. – dirn

+0

Jak usunąć migrację? –

+0

Migracje są po prostu plikami. Musisz tylko usunąć plik. Flask-Migrate zwykle przechowuje je wewnątrz 'migrations/version'. – dirn

Odpowiedz

10

Alembik przechowuje wersję bazy danych w tabeli tworzonej pod nazwą alembic_version. Ta tabela zawiera pojedyncze pole i wiersz alembic_version.version_num. Upewnij się, że wartość odpowiada nazwie pliku najnowszego pliku w migrations/version. Ten numer wersji znajduje się również w pliku zmian w zmiennej revision, która zazwyczaj pojawia się w linii 26 pliku. Upewnij się, że pasuje do wersji db.

Inną opcją jest po prostu upuścić db i odtworzyć go za pomocą programu alembic. Jeśli jest to środowisko programistyczne, w którym dane nie są ważne, byłoby to moim zaleceniem.

+0

Miałem ten sam problem, a Twoje rozwiązanie działało, ale jestem zdezorientowany w jednej sprawie. Właściwie to przypadkowo uruchomiłem tę samą komendę migracji dwa razy, więc w moim folderze migracje/wersje, zostały utworzone dwie takie same migracje, pierwsza faktycznie odzwierciedlała zmiany w moim modelu, druga była pusta. Czy uważasz, że mam ten problem z tego powodu? Ponieważ po sprawdzeniu alembic_version liczba pasująca do pierwszej migracji, ale nie do drugiej, – Humoyun

+0

Nie powinna powodować problemu, ponieważ jeśli otworzysz drugi skrypt migracji, zobaczysz, że tak naprawdę nic nie robi. Jeśli jesteś OCD (jak ja), możesz usunąć drugi plik migracji, który nie jest potrzebny. Po prostu upewnij się, że wartość "alembic_version.version_num" pasuje do nazwy pierwszego (poprawnego) skryptu migracji. –

4

Czuję, że zaakceptowana odpowiedź jest nieco zbyt skomplikowana. Miałem ten sam problem i sposób, w jaki go rozwiązałem, polegał po prostu na usunięciu migracji, która zawierała błędy kodowania. Nie potrzebujesz go tak czy inaczej, ponieważ, znowu, została zakodowana niepoprawnie. Znajdź najnowszą migrację w folderze migrations/versions, usuń ją, a następnie ponownie uruchom swoją migrację i uaktualnij. Nie musisz usuwać danych z bazy danych tylko po to, aby przeprowadzić migrację.

+0

dokładnie to, co zrobiłem :) – danidee

Powiązane problemy