目标数据库不是最新的

问题:目标数据库不是最新的

我想迁移一个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

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

谢谢

I’d like to make a migration for a Flask app. I am using Alembic.

However, I receive the following error.

Target database is not up to date.

Online, I read that it has something to do with this. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch

Unfortunately, I don’t quite understand how to get the database up to date and where/how I should write the code given in the link. If you have experience with migrations, can you please explain this for me

Thanks


回答 0

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

After creating a migration, either manually or as --autogenerate, you must apply it with alembic upgrade head. If you used db.create_all() from a shell, you can use alembic stamp head to indicate that the current state of the database represents the application of all migrations.


回答 1

这对我有用

$ flask db stamp head
$ flask db migrate
$ flask db upgrade

This Worked For me

$ flask db stamp head
$ flask db migrate
$ flask db upgrade

回答 2

我的想法是这样的,当我执行“ ./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)

现在,我可以再次进行迁移了。

My stuation is like this question, When I execute “./manage.py db migrate -m ‘Add relationship'”, the error occused like this ” alembic.util.exc.CommandError: Target database is not up to date.”

So I checked the status of my migrate:

(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

and found that the heads and the current are different!

I fixed it by doing this steps:

(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

And now the current is same to the head

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

And now I can do the migrate again.


回答 3

可以用多种方法解决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.

This can be solved bby many ways :

1 To fix this error, delete the latest migration file ( a python file) then try to perform a migration afresh.

If issue still persists try these commands :

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

回答 4

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

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

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

I had to delete some of my migration files for some reason. Not sure why. But that fixed the problem, kind of.

One issue is that the database ends up getting updated properly, with all the new tables, etc, but the migration files themselves don’t show any changes when I use automigrate.

If someone has a better solution, please let me know, as right now my solution is kind of hacky.


回答 5

$ 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/中找到更多信息。

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

You can find more info at the documentation https://flask-migrate.readthedocs.io/en/latest/


回答 6

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

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

现在解决了!

I did too run into different heads and I wanted to change one of the fields from string to integer, so first run:

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

It’s solved now!


回答 7

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

This can also happen if you, like myself, have just started a new project and you are using in-memory SQLite database (sqlite:///:memory:). If you apply a migration on such a database, obviously the next time you want to say auto-generate a revision, the database will still be in its original state (empty), so alembic will be complaining that the target database is not up to date. The solution is to switch to a persisted database.


回答 8

要解决此错误,请删除最新的迁移文件(python文件),然后尝试重新执行迁移。

To fix this error, delete the latest migration file ( a python file) then try to perform a migration afresh.


回答 9

在执行db upgrade命令之前,请尝试删除所有表。

Try to drop all tables before execute the db upgrade command.


回答 10

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

flask db migrate

flask db upgrade

To solve this, I drop(delete) the tables in migration and run these commands

flask db migrate

and

flask db upgrade