这取决于底层实现——Cursor 对象在驱动程序中的实际内容。
在许多 DB-api 实现中,Cursor 对象并不“有趣”(即,您可以保留很多对象并让 GC 担心它们),尤其是在您没有执行返回结果集的查询时。
我没有将 Python 与 Oracle 一起使用,但我怀疑(基于 JDBC 和其他方面的经验)Oracle 并非如此。Oracle JDBC 驱动程序具有服务器端游标,快速关闭它非常重要(默认的每个连接游标限制相当低;超过限制会导致尝试打开另一个游标失败)。
在 Oracle 中,依靠 GC 关闭游标可能是危险的,例如,如果您在循环中打开一个新游标,而 GC 将它们全部保留,直到循环函数返回。
如果这是真的,那么使用 with 语句构造来确保游标及时关闭可能会有所帮助,即使发生异常也是如此。
更新:您可以使用 contextlib.closure 作为上下文管理器,例如
with contextlib.closing(myconnection.cursor()) as curs:
curs.execute(...
# even if exception happens, cursor is still closed immediately
# after this block