在单元测试 SQLAlchemy 应用程序中使用 Alembic?

Using Alembic in unit testing a SQLAlchemy app?

我有 ORM 应用程序,它使用 SQLAlchemy、Alembic 进行迁移和 Pytest 进行测试。在我的测试中,我有一个数据库作为固定装置。过去,在我使用迁移之前,我会删除所有表并为每个测试会话重新创建它们。

既然我正在使用迁移,我也想使用 Alembic 来创建我的装置,因为我相信它更接近于模拟生产环境。(这是一个很好的理由吗?)

一种方法是 downgrade() 一直向下,每次 upgrade() 向上。我真的不喜欢这个。我可能是错的。

另一个是 drop_all()create_all() 进行单元测试,然后编写另一个测试,用 head 标记数据库并测试 upgradedowngrade

是否有另一种 good/standard 方法将迁移与固定装置集成,这样我就不必使用 drop_tables

或者有没有办法在 drop_tables 之后将数据库标记为 "tail" 或为空?没有明确使用版本 0 的迁移散列,导致创建依赖关系,例如 alembic downgrade -1 会使它回到 0 年。谢谢。

我建议每次都启动一个临时数据库实例,例如testing.mysqld or testing.postgresql。这种方法的优点是保证您每次都能重新开始;测试的成功将不取决于外部因素。缺点是启动实例需要额外的几秒钟。

如果你坚持使用现有的数据库实例,你可以像你说的那样使用create_all() + alembic stamp head。但是,不用 drop_all(),只需删除整个数据库(或模式,在 PostgreSQL 的情况下)并重新创建它。

如果你坚持使用drop_all(),你可以去掉alembic_version table告诉alembic当前版本是"tail".