Целевая база данных устарела


100

Я бы хотел выполнить миграцию для приложения Flask. Я использую Alembic.

Однако я получаю следующую ошибку.

Target database is not up to date.

В сети я прочитал, что это как-то связано с этим. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch

К сожалению, я не совсем понимаю, как обновить базу данных и где / как мне написать код, указанный в ссылке. Если у вас есть опыт миграции, не могли бы вы мне это объяснить?

Благодарность

Ответы:


103

После создания миграции вручную или как --autogenerateее необходимо применить с помощью alembic upgrade head. Если вы использовали db.create_all()из оболочки, вы можете использовать, alembic stamp headчтобы указать, что текущее состояние базы данных представляет приложение всех миграций.



38

Моя позиция похожа на этот вопрос: когда я выполняю «./manage.py db migrate -m 'Add Relationship'», возникает ошибка типа «alembic.util.exc.CommandError: целевая база данных устарела».

Итак, я проверил статус моей миграции:

(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

и обнаружил, что головы и ток разные!

Я исправил это, выполнив следующие действия:

(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

И теперь ток в голову такой же

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

И теперь я снова могу выполнить миграцию.


Работает как шарм! Я считаю, что это лучший способ решить эту проблему!
attaboyabhipro

Тоже самое! Сработало ровно. Я знал, что это связано с головками базы данных и током, но не знал, что есть команда «штамп». Благодарность!
Subspacian

10

Это можно решить разными способами:

1 Чтобы исправить эту ошибку, удалите последний файл миграции (файл python), затем попробуйте выполнить миграцию заново.

Если проблема не устранена, попробуйте эти команды:

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

8

По какой-то причине мне пришлось удалить некоторые файлы миграции. Не знаю почему. Но это вроде как устранило проблему.

Одна из проблем заключается в том, что база данных обновляется должным образом со всеми новыми таблицами и т. Д., Но сами файлы миграции не показывают никаких изменений, когда я использую автоматическую миграцию.

Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать, так как сейчас мое решение является своего рода хакерским.


Я знаю, что сейчас он немного устарел, но наследуются ли ваши таблицы от Base? У меня была такая же проблема, и автоматическая миграция не собирала изменений из-за того, что мои новые таблицы не наследуются от Base, где находится база, Base = declarative_base() и также помнитеfrom 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.

Дополнительную информацию можно найти в документации https://flask-migrate.readthedocs.io/en/latest/.


2

Я тоже столкнулся с разными головами, и я хотел изменить одно из полей со строки на целое число, поэтому сначала запустите:

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

Теперь это решено!


1

Это также может произойти, если вы, как и я, только что начали новый проект и используете базу данных SQLite в памяти ( sqlite:///:memory:). Если вы примените миграцию к такой базе данных, очевидно, что в следующий раз, когда вы захотите сказать автоматически сгенерировать ревизию, база данных все еще будет в исходном состоянии (пуста), поэтому alembic будет жаловаться, что целевая база данных не соответствует Дата. Решение - переключиться на постоянную базу данных.


0

Чтобы исправить эту ошибку, удалите последний файл миграции (файл python), а затем попробуйте выполнить миграцию заново.



-6

Чтобы решить эту проблему, я отбрасываю (удаляю) таблицы в миграции и запускаю эти команды.

flask db migrate

а также

flask db upgrade
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.