我有一个基于 Flask 的应用程序,我正在尝试使迁移能够管理数据库结构更改。在我开始使用 alembic 和 flask-migrate 之前,我的数据库不是空的,并且包含表和记录。
首先,我尝试单独使用 alembic,只需pip install alembic然后配置所有内容并使用autogenerate生成差异。一切正常,但输出并不完全符合我的预期:
INFO [alembic.autogenerate.compare] Detected removed table u'user'
Generating /Users/me/Documents/Project/app/migrations/versions/3de1151ce5de_.py ... done
所以表用户实际上存在于我的数据库中(我认为它是 postgresql 中的保留表)并且我从未删除它。另外,我还有一堆其他的表,这些表似乎对 alembic 是不可见的。起初我以为我没有正确配置 alembic,所以我重新开始并决定尝试Miguel Grinberg 的这个不错的烧瓶扩展。这更容易设置,但结果是完全相同的消息。
任何想法我做错了什么?
编辑:我决定添加一些关于我如何编辑原始 alembic env.py 的重要信息:
....
import sys,os sys.path.append(os.getcwd())
import app from app import db
target_metadata = db.metadata
....
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
# all the models need to be imported so they are visible when migration runs
from app.models import Model1, Model2, Model3, Model4, Model5
...
在任何迁移开始之前,alembic 必须进行这些更改才能查看我的声明性基础和模型。放弃独立方法后,我只是按照烧瓶迁移教程进行操作,并没有触及那里的任何文件。
编辑:好的,所以我们已经解释了已删除的“用户”表。尽管如此,我的其他模型并没有出现在脚本中。我认为会发生什么,因为在创建迁移脚本之前启动了应用程序,sqlalechmy db.create_all()调用创建了表,这就是为什么 alembic 在列与模型中没有看到任何差异的原因。也许我在错误的地方调用create_all() ?
编辑:是的!就是这样,我将db.create_all() 移到 manager.run()下方,它现在可以正确检测到更改。感谢所有的帮助!