Flask-SQLAlchemy 集成测试每次测试后使用外键约束清除数据库

Flask-SQLAlchemy integration test clear database after each test with foreign key constraints

我想知道如何使用 flask-sqlalchemyunittest 编写快速集成测试,而不必在每个测试中创建和删除表。我正在使用 Postgres 作为我的数据库。

现在,表分别在 setUpClasstearDownClass 中创建和删除,从性能的角度来看这很好。我需要的是一种在每个单独测试中删除所有数据并“重置”数据库的方法,而无需重新创建所有表。

我得到的最接近的是这段代码,但由于外键约束,它引发了 IntegrityError

def tearDown(self):
    meta = db.metadata
    for table in reversed(meta.sorted_tables):
        db.session.execute(table.delete())

    db.session.commit()

重要说明:由于我正在进行集成测试,我不可避免地会在我的应用程序代码中遇到 db.session.commit,这会使任何会话事务无效,因此我无法将其用作解决方案。

试试这个:

for table in reversed(meta.sorted_tables):
    db.session.execute(f"TRUNCATE {table.name} RESTART IDENTITY CASCADE;")

CASCADE 在这里发挥作用,来自 postgres docs:

Automatically truncate all tables that have foreign-key references to any of the named tables, or to any tables added to the group due to CASCADE.

所以它告诉 postgres 删除所有指向截断 table 中的行的行。

另一方面,RESTART IDENTITY:

Automatically restart sequences owned by columns of the truncated table(s).

使您的自动增量列从头开始。