事务管理器恢复/回滚上次提交

时间:2014-07-30 08:58:45

标签: python sqlalchemy pyramid

我尝试通过将测试数据从测试用例setUp()放到setUpClass()/teardownClass类方法来加速我的测试,因此它不会为测试用例中的每个测试重新创建相同的仅选择夹具。

@classmethod
def setUpClass(cls):
    plant.StuffFactory() #plant stuff with FactoryBoy
    transaction.commit()

@classmethod
def tearDownClass(cls):
    session.query(models.Stuff).delete() # delete planted stuff
    transaction.commit()

但我不喜欢自己删除session.delete的东西,因为我使用了很多模型而不想跟踪我种植的内容。我想要像

这样的东西
@classmethod
def tearDownClass(cls):
    session.clear() #delete all
    transaction.commit()

session.close()session.remove()不会影响已提交的数据。 所以我寻求某种方式来“取消”setUpClass transaction.commit(),就像我不种植任何东西一样。

我尝试嵌套的事务和保存点,但只有在尚未提交数据的情况下,它们才会起作用。

任何指针?

2 个答案:

答案 0 :(得分:2)

如果您不想要提交内容,请不要致电transaction.commit():)

@classmethod
def setUpClass(cls):
    plant.StuffFactory() #plant stuff with FactoryBoy
    # you may possibly want to flush the session, so everything has proper IDs etc.
    DBSession.flush() 
    # let the transaction continue for the duration of the test

@classmethod
def tearDownClass(cls):
    # let the database make everything as if nothing happened
    transaction.rollback()

这将要求您测试的所有代码都不会在应用程序代码中进行显式事务管理(transaction.commit() \ transaction.rollback()),但这无论如何都是不好的做法。

答案 1 :(得分:1)

setUpClass()中,您可以创建一个保存点:

sp = transaction.savepoint()

然后在tearDownClass()中你可以简单地使用:

sp.rollback()

希望这有帮助。