Skip to main content
 首页 » 编程设计

python之在 Python 中如何检查您是否正在与 ZODB 进行交易

2025年05月04日7yxwkf

我正在编写一些涉及 ZODB 的测试,由于在某些单元测试中遇到错误,我被困了很长时间。我们称它为 Test_B :

Failure/Error: 'NoneType' object has no attribute 'sortKey' 
... 
 File <<< my code somewhere >>> 
     transaction.commit() 
 File "/usr/local/lib/python2.7/site-packages/transaction/_manager.py", line 111, in commit 
     return self.get().commit() 
 File "/usr/local/lib/python2.7/site-packages/transaction/_transaction.py", line 280, in commit 
     reraise(t, v, tb) 
 File "/usr/local/lib/python2.7/site-packages/transaction/_transaction.py", line 271, in commit 
     self._commitResources() 
 File "/usr/local/lib/python2.7/site-packages/transaction/_transaction.py", line 386, in _commitResources 
     L.sort(key=rm_key) 
 File "/usr/local/lib/python2.7/site-packages/transaction/_transaction.py", line 555, in rm_key 
     return func() 
 File "/usr/local/lib/python2.7/site-packages/ZODB/Connection.py", line 813, in sortKey 
     return "%s:%s" % (self._storage.sortKey(), id(self)) 

值得庆幸的是,我最终发现我忘记在 transaction.commit() 之前运行的测试中调用 Test_B 调用(不出所料) Test_A 。日志记录的事件顺序如下所示:

<<< Test_A begins >>> 
23:01:41 DEBUG    txn.140735119446400: new transaction 
... 
<<< no further mentions of txn.140735119446400 being committed or aborted >>> 
<<< Test_A ends >>> 
<<< Test_B begins >>> 
23:01:41 DEBUG    txn.140735119446400: new transaction 
23:01:41 DEBUG    my_spec: *** MANUALLY altered DB in Test_B body 
... 
<<< Test_B bails out due to error >>> 

注意 Test A 成功:这是错误的!我希望 Test A 失败并告诉我我忘记提交的事务中有未完成的更改。

如何使用 ZODB 执行此操作?我在文档中找不到任何可用于确定我是否在进行更改的事务中的任何内容。

显然,通过该检查,我可以将其粘贴到套件中所有单元测试的 AfterEach block 中。

请您参考如下方法:

您通常会在测试之间关闭与 ZODB 的连接,以确保测试是隔离的。

关闭与事件事务的 ZODB 连接将引发异常:

>>> from ZODB.FileStorage import FileStorage 
>>> from ZODB.DB import DB 
>>> storage = FileStorage('Data.fs') 
>>> db = DB(storage) 
>>> connection = db.open() 
>>> root = connection.root() 
>>> root['foo'] = 'bar' 
>>> connection.close() 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
  File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/ZODB/Connection.py", line 286, in close 
    raise ConnectionStateError("Cannot close a connection joined to " 
ZODB.POSException.ConnectionStateError: Cannot close a connection joined to a transaction