Python Alembic/x27;无法识别数据库结构

Python Alembic/x27;无法识别数据库结构,python,postgresql,flask,alembic,flask-migrate,Python,Postgresql,Flask,Alembic,Flask Migrate,我有一个基于Flask的应用程序,我正在尝试使迁移能够管理数据库结构更改。在开始使用alembic和flask migrate之前,我的数据库不是空的,它包含表和记录 首先,我尝试使用alembic单机版,只需pip安装alembic,然后配置所有内容,并使用autogenerate生成差异。所有操作都很好,但输出与我预期的不完全一致: INFO [alembic.autogenerate.compare] Detected removed table u'user' Generating

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

首先,我尝试使用alembic单机版,只需pip安装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,所以我重新开始并决定尝试。这很容易设置,但结果完全相同

知道我做错了什么吗

编辑:我决定添加一些关于如何编辑我的原始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教程进行操作,没有触及任何文件

编辑:好的,我们已经解释了删除的“用户”表。不过,我的其他模型没有出现在脚本中。我认为发生的情况是,由于应用程序是在创建迁移脚本之前启动的,因此sqlalechmydb.create_all()调用会创建表,这就是为什么alembic没有看到colums与models之间的任何差异。也许我在错误的地方调用了create_all()


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

您的数据库有一个
用户
表,该表在任何SQLAlchemy模型中都没有表示。对吗

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

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

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


不幸的是,每次发布新迁移时,表remove都会再次出现。我认为Alembic没有提供异常的方法。

好的,但这只解决了一半的问题。我知道每次都需要检查自动创建的迁移脚本,但我的其他模型没有出现-请参阅我编辑的问题。使用Flask Migrate/Alembic时,不要调用
db.create_all()
。迁移框架取代了这个调用。