如何确保在调试期间关闭sqlite数据库连接?

时间:2013-03-21 15:13:26

标签: python sqlite try-catch try-except

我正在研究一些连接到sqlite数据库的代码。在调试所述代码的过程中,我遇到的问题是我挂起了与数据库的连接,因为某些错误阻止了执行close命令。因为db和c是在函数中定义的,所以我无法从命令行中找到并关闭这些对象。它们就像是孤立的连接或类似的东西,但无论如何它们阻止我对数据库做任何其他事情,直到我关闭并重新打开我的交互式控制台。这是它的样子:

def something()
    db=sqlite3.connect('mydatabase')
    c=db.cursor()

    somecode
    lots of different things happening in here
    this may have errors
    thus stopping execution

    db.commit()
    c.close()
    db.close()

我尝试了一个try / except子句,最后关闭操作在“finally”块中,但这可以防止异常在我调试时被提升回交互式输出,并且事情“无声地”失败(也许我“我没有做那个部分吗?”有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

一般情况下,使用...作为声明:

with sqlite.connect(...) as db:
    with db.cursor() as c:
        ...

with 语句保证在语句结束或引发异常时对对象调用close()。即使从内部调用回报或收益率。

在这里阅读更多内容: http://docs.python.org/2/reference/compound_stmts.html#with

答案 1 :(得分:3)

正如Piotr所指出的,使用with语句可以提高代码效率,但是如果用户需要的话,它不会显式关闭与数据库的连接。这是通过类似的问题here找到的。

使用with语句执行的操作是运行con.commit()方法,如果with语句中的代码块执行没有错误;如果遇到异常,则使用con.rollback()方法。

来自http://docs.python.org/2/library/sqlite3.html

的示例
import sqlite3

con = sqlite3.connect(":memory:")
con.execute("create table person (id integer primary key, firstname varchar unique)")

with con:
    con.execute("insert into person(firstname) values (?)", ("Joe",))

# If Successful, con.commit() is called automatically afterwards
# else con.rollback() is called after the with block finishes with an exception, 
# the exception is still raised and must be caught

try:
    with con:
        con.execute("insert into person(firstname) values (?)", ("Joe",))
except sqlite3.IntegrityError:
    print "couldn't add Joe twice"

注意使用快捷方法con.execute()这是数据库连接对象的一种方法。这会隐式为您创建游标对象并返回结果,因此需要编写更少的代码。

答案 2 :(得分:0)

要清理资源,请仅使用 <{em> finally

db = sqlite.connect(...)
try:
    ...
    c = db.cursor()
    try:
        ...
    finally:
        c.close()
    ...
finally:
    db.close()