这是场景.在您的函数中,您使用游标执行语句,但其中一个失败并抛出异常.在关闭正在使用的光标之前,您的程序退出该函数.光标是否会占用空间?我必须关闭光标吗?
另外,Python文档中有一个游标使用示例,并说:"如果完成游标,我们也可以关闭游标." 关键字是"可以",而不是"必须".这是什么意思呢?
这可能是一个好主意(虽然它与sqlite无关,但不知道那里,但它会使你的代码更加便携).此外,使用最近的Python(2.5+),它很容易:
from __future__ import with_statement from contextlib import closing with closing(db.cursor()) as cursor: # do some stuff
你没有义务打电话close()
; 它可以像任何其他对象一样被垃圾收集.
但即使等待垃圾收集听起来没问题,我认为仍然可以确保数据库游标等资源无论是否存在异常都是好的方式.
我还没有看到对sqlite3.Cursor.close()
手术有任何影响.
关闭后,您仍然可以调用fetch(all|one|many)
哪个将返回上一个execute语句的剩余结果.即使跑步Cursor.execute()
仍然有效......
有趣的是,Python 3.0文档说“如果完成操作,我们也可以关闭游标”,而Python 2.7和3.6文档说:“完成后也可以关闭连接 ”。
Python 2.7和3.0-3.4文档未描述游标.close()
方法。但是Python 3.5和3.6文档描述了cursor.close()
方法:
立即关闭光标(而不是在任何时候
__del__
调用)。从现在开始,光标将无法使用。一
ProgrammingError
,如果任何操作试图用光标将引发异常。
此代码将自动关闭Cursor
。它还将自动关闭并提交Connection
。
import sqlite3 import contextlib def execute_statement(statement): with contextlib.closing(sqlite3.connect(path_to_file)) as conn: # auto-closes with conn: # auto-commits with contextlib.closing(conn.cursor()) as cursor: # auto-closes cursor.execute(statement)