目标数据库不是最新的


104

我想迁移一个Flask应用程序。我正在使用Alembic。

但是,我收到以下错误。

Target database is not up to date.

在网上,我读到它与此有关。 http://alembic.zzzcomputing.com/zh-CN/latest/cookbook.html#building-an-up-to-date-database-from-scratch

不幸的是,我不太了解如何使数据库保持最新状态,以及在何处/如何编写链接中给出的代码。如果您有迁移的经验,能否请您为我解释一下

谢谢

Answers:


109

创建迁移后,无论是手动还是as --autogenerate,都必须使用进行应用alembic upgrade head。如果db.create_all()从外壳程序使用alembic stamp head,则可以用来表示数据库的当前状态代表所有迁移的应用程序。



39

我的想法是这样的,当我执行“ ./manage.py db migration -m'添加关系'”时,出现的错误是这样的:“ 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

同样在这里!工作顺利。我知道它与db heads和current有关,但不知道有“ stamp”命令。谢谢!
Subspacian

13

可以用多种方法解决bby:

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.

9

由于某种原因,我不得不删除一些迁移文件。不知道为什么。但这解决了问题。

一个问题是数据库最终会正确更新,包括所有新表等,但是当我使用自动迁移时,迁移文件本身不会显示任何更改。

如果有人有更好的解决方案,请让我知道,因为目前我的解决方案有点怪异。


我知道它现在有点旧了,但是您的表是否继承自Base?我遇到了同样的问题,由于我的新表不是从Base继承而来的,Base = declarative_base() from sqlalchemy.ext.declarative import declarative_base


2

我也遇到了不同的想法,我想将其中一个字段从字符串更改为整数,因此首先运行:

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

现在解决了!


1

如果您和我一样刚刚开始一个新项目,并且正在使用内存中的SQLite数据库(sqlite:///:memory:),也会发生这种情况。如果您在这样的数据库上应用迁移,那么很明显,下次您要说自动生成修订时,数据库仍将保持其原始状态(空),因此,Alembic会抱怨目标数据库未达到要求日期。解决方案是切换到持久数据库。




-6

为了解决这个问题,我删除(删除)了迁移中的表并运行以下命令

flask db migrate

flask db upgrade
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.