Python 测试中模型导入和alembic架构升级之间的SQLAlchemy元数据冲突
我有一个带有PostgreSQL数据库、Alembic迁移和SQLAlchemy的Flask应用程序 最近,我开始编写针对数据库的集成测试。我导入一个映射到表“Item”的模型(比如Item),执行“从模型导入Item”会触发表的SQLAlchemy元数据的构造 在我的测试设置中,我有Python 测试中模型导入和alembic架构升级之间的SQLAlchemy元数据冲突,python,sqlalchemy,alembic,Python,Sqlalchemy,Alembic,我有一个带有PostgreSQL数据库、Alembic迁移和SQLAlchemy的Flask应用程序 最近,我开始编写针对数据库的集成测试。我导入一个映射到表“Item”的模型(比如Item),执行“从模型导入Item”会触发表的SQLAlchemy元数据的构造 在我的测试设置中,我有 def setUpClass(cls): try: os.remove('testdb.db:') except: pass
def setUpClass(cls):
try:
os.remove('testdb.db:')
except:
pass
#Run db migrations
global db_manager
db_manager = DatabaseManager()
alembic_cfg = Config("./alembic.ini")
alembic_cfg.attributes['db_manager'] = db_manager
command.upgrade(alembic_cfg, "head")
这导致
sqlalchemy.exc.InvalidRequestError:已为此元数据实例定义了表“项”。指定“extend_existing=True”以重新定义现有表对象上的选项和列
我已对此进行调试,使元数据对象在两次调用之间相同,从而将“item”表两次累积到其tables数组中
我有另一个几乎完全相同的应用程序,这个设置可以工作,所以我知道它在理论上应该可以工作。在另一个应用程序中,导入和升级阶段的元数据对象不同,因此alembic运行升级时表数组为空,因此没有错误
对不起,我不能提供实际的代码,工作项目。如果我有时间的话,也许可以构造一个最小的玩具示例
如果我了解了在SQLAlchemy中元数据的实际创建位置,我也许能够找到alembic在工作应用程序中而不是在问题应用程序中获得干净元数据实例的原因
在工作应用程序中,未设置“extend_existing”,我不希望调用一些hack来掩盖潜在问题