1

在最新版本的 python 中,即使在以下(缩进的)代码块中发生异常,也可以使用类似with open('abc.txt') as f:的方法来保证文件已关闭。我想知道这种技术是否也适用于 cx_Oracle 连接对象。例如,如果在后续代码块中发生错误,我是否可以这样做来保证数据库连接关闭:

with cx_Oracle.connect('uname/pwd@schema.db') as conn:
  c = conn.Cursor()
  c.execute("Select * from table1")
  #...etc

目前我可以通过使用 try...except...finally 来实现这一点,但我更喜欢 with...as 技术。

4

2 回答 2

8

是的,Connection对象可以充当上下文管理器

于 2012-06-22T19:09:50.307 回答
4

即使 Connection 对象自己没有这样做(显然它确实这样做了),只要它提供了一个方法,就可以很容易地使用contextlib.closure.close()制作自己的包装器

>>> from contextlib import closing
>>> 
>>> class FakeC(object):
...     def close(self):
...         print 'closing!'
...     def execute(self, cmd):
...         print cmd
... 
>>> with closing(FakeC()) as c:
...     c.execute("fred")
...     raise Exception("something went wrong!")
... 
fred
closing!
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
Exception: something went wrong!

其他变体几乎同样容易。

[在上面写上“是!” 答案已发布并决定发布它。]

于 2012-06-22T19:14:19.630 回答