我有一个基于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在开始任何迁移之前查看我的声明性基础和模型是必需的。删除独立方法之后,我只是按照flask-migrate教程进行操作,没有接触那里的任何文件。
编辑:好的,所以我们已经解释了删除的“用户”表。尽管如此,我的其他模型仍未出现在脚本中。我认为会发生什么情况是因为该应用程序是在创建迁移脚本之前启动的,所以sqlalechmy db.create_all()调用会创建表,这就是为什么alembic在colums vs模型中看不到任何差异的原因。也许我在错误的地方调用了create_all()?
编辑:是的!就是这样,我感动db.create_all()以下manager.run() ,它现在正确检测到的变化。感谢您提供的所有帮助!
您的数据库具有一个user
表,该表未在任何SQLAlchemy模型中表示。正确的?
然后,Alembic将假定您已删除该表,因为所有自动迁移脚本所做的工作都是显示您的应用程序中定义的模型与实际数据库之间的差异。Alembic无法知道数据库中是否有一个表被视为不受迁移脚本的影响。
在任何情况下,自动迁移功能都很好,但是不应认为它是完全“自动”的。使用它们之前,您始终必须检查生成的脚本并修复所有错误或不准确性。
前进的方法是编辑迁移脚本以更正此问题。只是拿走那个删除表。迁移脚本是手工编辑的,不要害怕这样做。
不幸的问题是,每次您发布新迁移时,表删除都会再次显示。我认为Alembic没有办法提供例外。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句