Docelowa baza danych jest nieaktualna

104

Chciałbym dokonać migracji aplikacji Flask. Używam Alembic.

Jednak pojawia się następujący błąd.

Target database is not up to date.

W Internecie przeczytałem, że ma to coś wspólnego z tym. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch

Niestety nie bardzo rozumiem, jak zaktualizować bazę danych i gdzie / jak mam napisać kod podany w linku. Jeśli masz doświadczenie z migracjami, czy możesz mi to wyjaśnić

Dzięki

GangstaGraham
źródło

Odpowiedzi:

109

Po utworzeniu migracji, ręcznie lub jako --autogenerate, należy ją zastosować za pomocą alembic upgrade head. Jeśli użyto db.create_all()z powłoki, możesz użyć, alembic stamp headaby wskazać, że bieżący stan bazy danych reprezentuje zastosowanie wszystkich migracji.

dawidyzm
źródło
72

To zadziałało dla mnie

$ flask db stamp head
$ flask db migrate
$ flask db upgrade
Nsagha Kingsly
źródło
39

Moje stwierdzenie jest podobne do tego pytania: Kiedy wykonuję polecenie „./manage.py db migrate -m 'Dodaj relację'”, pojawił się błąd, taki jak „alembic.util.exc.CommandError: Docelowa baza danych nie jest aktualna”.

Sprawdziłem więc stan mojej migracji:

(venv) ]#./manage.py db heads
d996b44eca57 (head)
(venv) ]#./manage.py db current
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
715f79abbd75

i stwierdziłem, że głowy i prąd są różne!

Naprawiłem to, wykonując następujące kroki:

(venv)]#./manage.py db stamp heads
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running stamp_revision 715f79abbd75 -> d996b44eca57

A teraz prąd jest taki sam na głowie

(venv) ]#./manage.py db current
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
d996b44eca57 (head)

A teraz mogę ponownie przeprowadzić migrację.

LittleLogic
źródło
Działa jak marzenie ! Uważam, że to najlepszy sposób na rozwiązanie tego problemu!
attaboyabhipro
To samo tutaj! Pracował gładko. Wiedziałem, że ma to związek z głowicami db i prądem, ale nie wiedziałem, że jest to polecenie „stempel”. Dzięki!
Subspacian
13

Można to rozwiązać na wiele sposobów:

1 Aby naprawić ten błąd, usuń najnowszy plik migracji (plik Pythona), a następnie spróbuj wykonać migrację od nowa.

Jeśli problem nadal występuje, wypróbuj te polecenia:

$ flask db stamp head  # To set the revision in the database to the head, without performing any migrations. You can change head to the required change you want.
$ flask db migrate     # To detect automatically all the changes.
$ flask db upgrade     # To apply all the changes.
Anupam Haldkar
źródło
9

Z jakiegoś powodu musiałem usunąć niektóre pliki migracji. Nie pewny dlaczego. Ale to rozwiązało problem.

Jednym z problemów jest to, że baza danych jest aktualizowana prawidłowo, wraz ze wszystkimi nowymi tabelami itp., Ale same pliki migracji nie pokazują żadnych zmian, gdy używam automigracji.

Jeśli ktoś ma lepsze rozwiązanie, daj mi znać, ponieważ teraz moje rozwiązanie jest trochę hakerskie.

GangstaGraham
źródło
Wiem, że jest teraz trochę stary, ale czy twoje tabele dziedziczą po Base? Miałem ten sam problem i automatyczna migracja nie odbierała zmian ze względu na fakt, że moje nowe tabele nie dziedziczyły z Base, gdzie jest baza, Base = declarative_base() a także pamiętamfrom sqlalchemy.ext.declarative import declarative_base
7
$ flask db stamp head  # To set the revision in the database to the head, without performing any migrations. You can change head to the required change you want.
$ flask db migrate  # To detect automatically all the changes.
$ flask db upgrade  # To apply all the changes.

Więcej informacji można znaleźć w dokumentacji https://flask-migrate.readthedocs.io/en/latest/

Sergi Ramón
źródło
2

Ja też wpadłem na różne głowy i chciałem zmienić jedno z pól ze string na integer, więc najpierw uruchom:

$ flask db stamp head # to make the current the same
$ flask db migrate
$ flask db upgrade

To już rozwiązane!

Serg
źródło
1

Może się to również zdarzyć, jeśli tak jak ja właśnie rozpocząłeś nowy projekt i używasz bazy danych SQLite w pamięci ( sqlite:///:memory:). Jeśli zastosujesz migrację do takiej bazy danych, oczywiście następnym razem, gdy chcesz powiedzieć, że automatycznie wygenerujesz wersję, baza danych będzie nadal w swoim pierwotnym stanie (pusta), więc alembic będzie narzekał, że docelowa baza danych nie jest w stanie data. Rozwiązaniem jest przejście do utrwalonej bazy danych.

jbasko
źródło
0

Aby naprawić ten błąd, usuń najnowszy plik migracji (plik pythona), a następnie spróbuj wykonać migrację od nowa.

Patrick Mutuku
źródło
-2

Spróbuj usunąć wszystkie tabele przed wykonaniem komendy db upgrade.

Rafael Rotiroti
źródło
-6

Aby rozwiązać ten problem, upuszczam (usuwam) tabele podczas migracji i uruchamiam te polecenia

flask db migrate

i

flask db upgrade
fill_J
źródło