我有一个带有PostgreSQL数据库,Alembic迁移和SQLAlchemy的Flask应用程序。
最近,我开始针对数据库编写集成测试。我导入了一个模型(例如Item),该模型被映射到表“ item”,并且执行“从模型导入Item”触发了为我的表构造SQLAlchemy元数据。
在我的测试设置中,我有
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:已为此MetaData实例定义表'item'。指定'extend_existing = True'重新定义现有Table对象上的选项和列。
我已将其调试为调用之间的元数据对象相同,从而将“ item”表两次累加到其表数组中。
我还有一个与此应用程序非常相似的应用程序,因此我知道它在理论上应该可以工作。在此其他应用程序中,导入和升级阶段的元数据对象<差异>差异,因此当alembic运行升级时,表数组为空,因此没有错误。
对不起,我无法提供实际的代码,工作项目。如果有时间的话,也许可以构建一个最小的玩具示例。
如果我了解了元数据实际上是在SQLAlchemy内部创建的,那么我也许能够找到为什么Alembic在工作应用程序而不是问题应用程序中获得干净的元数据实例的原因。
在正在运行的应用程序中,未设置“ extend_existing”,我宁愿不调用某些技巧来掩盖潜在的问题。