在单元测试 SQLAlchemy 应用程序中使用 Alembic?
Using Alembic in unit testing a SQLAlchemy app?
我有 ORM 应用程序,它使用 SQLAlchemy、Alembic 进行迁移和 Pytest 进行测试。在我的测试中,我有一个数据库作为固定装置。过去,在我使用迁移之前,我会删除所有表并为每个测试会话重新创建它们。
既然我正在使用迁移,我也想使用 Alembic 来创建我的装置,因为我相信它更接近于模拟生产环境。(这是一个很好的理由吗?)
一种方法是 downgrade()
一直向下,每次 upgrade()
向上。我真的不喜欢这个。我可能是错的。
另一个是 drop_all()
和 create_all()
进行单元测试,然后编写另一个测试,用 head 标记数据库并测试 upgrade
和 downgrade
。
是否有另一种 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".
我有 ORM 应用程序,它使用 SQLAlchemy、Alembic 进行迁移和 Pytest 进行测试。在我的测试中,我有一个数据库作为固定装置。过去,在我使用迁移之前,我会删除所有表并为每个测试会话重新创建它们。
既然我正在使用迁移,我也想使用 Alembic 来创建我的装置,因为我相信它更接近于模拟生产环境。(这是一个很好的理由吗?)
一种方法是 downgrade()
一直向下,每次 upgrade()
向上。我真的不喜欢这个。我可能是错的。
另一个是 drop_all()
和 create_all()
进行单元测试,然后编写另一个测试,用 head 标记数据库并测试 upgrade
和 downgrade
。
是否有另一种 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".