在SQLite中执行con.execute后是否需显式调用con.close()?含代码场景
关于
_te函数是否需要调用close()的解答 先给结论:你的_te函数完全不需要手动调用close(),原因如下:
你在代码里用了with语句来管理数据库连接conn,而sqlite3.Connection对象实现了Python的上下文管理器协议。当代码执行到with块的末尾时——不管是正常执行完返回结果,还是中途抛出异常——上下文管理器都会自动调用连接的close()方法,帮你完成数据库连接的资源清理工作。
你遇到的矛盾信息解释
你看到的两种说法其实并不冲突,只是适用场景不同:
- 你提到的Stack Overflow回答,核心是说通过
with语句(上下文管理器)使用数据库连接时,不需要手动处理关闭,内部会通过异常保障逻辑(类似Python里的try/finally)确保连接被关闭,只是它的表述比较笼统,原文翻译为:无需担心关闭数据库。当调用prepare或execute时,这些调用完成后会自动调用close。内部有rescue/ensure块确保即使发生错误也会关闭数据库。
- 官方sqlite3文档的示例没有使用
with语句,是直接创建了连接对象con,这种情况下确实需要手动调用con.close(),因为没有上下文管理器自动处理资源释放,翻译后的示例代码及注释如下:# 创建并填充表。 con = sqlite3.connect(":memory:") con.execute("CREATE TABLE lang(name, first_appeared)") data = [ ("C++", 1985), ("Objective-C", 1984), ] con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data) # 打印表内容 for row in con.execute("SELECT name, first_appeared FROM lang"): print(row) print("我刚删除了", con.execute("DELETE FROM lang").rowcount, "行数据") # close()不是快捷方法,不会自动调用; # 连接对象需要手动关闭 con.close()
回到你的代码,_connect_db返回的连接被with包裹,所以整个with块执行完毕后连接会自动关闭,完全不需要额外添加conn.close()代码。
内容的提问来源于stack exchange,提问作者InfiniteLoop
相关产品推荐
相关产品推荐

