Alembic / Flask-migrate无法识别数据库结构

时间:2014-01-31 14:45:45

标签: python postgresql flask alembic flask-migrate

我有一个基于Flask的应用程序,我正在尝试启用迁移,以便能够管理数据库结构更改。在我开始使用alembic和flask-migrate之前,我的数据库不是空的并且包含表格和记录。

首先,我尝试使用alembic独立,只需 pip install alembic ,然后配置所有内容并使用 autogenerate 生成diff。一切正常,但输出并不完全符合我的预期:

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没有看到colums vs中的任何差异的原因楷模。也许我在错误的地方叫 create_all()

编辑:是的!就是这样,我将 db.create_all()移到 manager.run()下面,它现在可以正确检测到这些更改。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

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

前进的方法是编辑迁移脚本以更正此问题。把那张桌子取走吧。迁移脚本是手工编辑的,不要害怕这样做。

不幸的问题是,每次发出新的迁移时,表删除都会再次显示。我不认为Alembic有办法提供例外。