【问题标题】:Alembic/Flask-migrate doesn't recognise database structureAlembic/Flask-migrate 无法识别数据库结构
【发布时间】:2014-02-24 07:26:15
【问题描述】:

我有一个基于 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

所以表 user 实际上存在于我的数据库中(我认为它是 postgresql 中的保留表)并且我从未删除它。另外,我还有一堆其他的表,这些表似乎对 alembic 是不可见的。一开始我以为我没有正确配置alembic,所以我重新开始并决定尝试this nice flask extension by 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() 移到 ma​​nager.run() 下方,它现在可以正确检测到更改。感谢大家的帮助!

【问题讨论】:

    标签: python postgresql flask alembic flask-migrate


    【解决方案1】:

    您的数据库有一个user 表,它没有在您的任何 SQLAlchemy 模型中表示。对吗?

    然后,Alembic 将假定您已删除该表,因为所有自动迁移脚本所做的只是显示您的应用程序中定义的模型与实际数据库之间的差异。 Alembic 无法知道您的数据库中有一个表被视为免于迁移脚本。

    无论如何,自动迁移功能很棒,但它不应该是完全“自动”的。在使用它们之前,您始终必须查看生成的脚本并修复任何错误或不准确之处。

    继续前进的方法是编辑迁移脚本以更正此问题。把那个删除表拿走。迁移脚本是手工编辑的,不要害怕这样做。

    不幸的问题是,每次您发出新的迁移时,table remove 都会再次出现。我不认为 Alembic 有办法提供例外。

    【讨论】:

    • 好的,但这只能解决一半的问题。我知道每次都需要检查自动创建的迁移脚本,但我的其他模型没有出现 - 请参阅我编辑的问题。
    • 在使用 Flask-Migrate/Alembic 时不要调用 db.create_all()。迁移框架取代了该调用。
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2019-07-13
    • 2015-07-15
    • 2021-11-08
    • 2019-06-12
    • 2013-07-31
    • 2020-09-24
    • 2016-07-27
    相关资源
    最近更新 更多