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

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.



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ę.


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.

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.


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/


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!


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.


0

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



-6

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

flask db migrate

i

flask db upgrade
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.