如何判断Python SQLite数据库连接或游标是否关闭?
问题描述:
假设你有下面的代码:如何判断Python SQLite数据库连接或游标是否关闭?
import sqlite3
conn = sqlite3.connect('mydb')
cur = conn.cursor()
# some database actions
cur.close()
conn.close()
# more code below
如果我尝试以后使用conn
或cur
对象,我怎么能告诉他们关闭?我找不到.isclosed()
方法或类似的东西。
答
你可以在一个try, except
声明包装:
>>> conn = sqlite3.connect('mydb')
>>> conn.close()
>>> try:
... resultset = conn.execute("SELECT 1 FROM my_table LIMIT 1;")
... except sqlite3.ProgrammingError as e:
... print e
Cannot operate on a closed database.
这依赖于一个shortcut specific to sqlite3。
答
如何确保连接和游标永不关闭?
你可以有一个基于状态的程序,你可以保证只在正确的时间调用close()。
或者将它们包装在通过执行close()
的其他对象中。或者添加一个_isclosed
成员close()
设置并访问isclosed()
。
该方法是理智的,但避免做一个'SELECT * FROM mytable',同时你可以做一个更轻的'SELECT one_column FROM mytable LIMIT 1'。前者效率非常低,你有一个非小型数据库。 – 2009-12-30 22:07:57
谢谢@pitrou,更新后考虑到这一点。 – bernie 2009-12-30 22:22:41
@AntoineP。 SQLite与其他数据库混淆。 SQLite完成的工作量没有差异。它不会计算查询的所有结果 - 相反,它会尽可能少地提供第一个结果行。第二个结果行只有在你要求时才能解决。因此限制不起作用。无论如何,更好的查询不依赖于模式 - 例如PRAGMA user_version。 – 2014-06-24 18:36:54