【问题标题】:sqlalchemy - force it to NEVER commit?sqlalchemy - 强制它从不提交?
【发布时间】:2014-04-30 17:48:00
【问题描述】:

我正在使用带有 SQLAlchemy 的夹具来创建一些集成测试。

我想将 SQLAlchemy 设置为“从不提交”模式,以防止将更改写入数据库,从而使我的测试彼此完全隔离。有没有办法做到这一点?

我最初的想法是,也许我可以用模拟对象替换Session.commit;但是我不确定是否还有其他可能具有相同效果的事情,如果我要走那条路,我也需要模拟。

【问题讨论】:

  • 你确定你需要这个吗?内存中的 sqlite 数据库能否满足您的需求?
  • @IfLoop 是的,我需要这个。不,内存中的 sqlite 在这里没有帮助,也没有租赁,因为我们的数据库模式与使用 DB2 非常相关。
  • @Marcin 考虑另一种方法 - 使用 setupteardown 进行清理。否则,您将依赖测试代码的行为,这可能会出错。
  • 在其他事务模型中,我将其视为transaction.doom(),例如在ZODBpyramid_tm。看了sqlalchemy.engine.Transaction,觉得不支持。
  • @JanVlcinsky 是的,但是 session.rollback() 在我的测试中没有任何效果。我当然愿意接受任何可以为每个测试提供完全隔离的方法,但它必须通过(或通过颠覆)sqlalchemy 来实现。

标签: python testing sqlalchemy


【解决方案1】:

默认情况下,作用域会话管理器将为每个连接返回相同的会话对象。因此,可以将.commit 替换为.flush,并在对会话管理器的调用中保持该更改。

这将阻止提交。

要回滚所有更改,应使用session.transaction.rollback()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2018-04-26
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    相关资源
    最近更新 更多