Python sqlite3.Cursor.close 方法
上次修改时间:2025 年 4 月 15 日
这篇综合指南探讨了 Python 的 sqlite3.Cursor.close 方法,该方法对于正确的数据库资源管理至关重要。我们将通过实际示例介绍其目的、使用模式和最佳实践。
基本定义
sqlite3.Cursor.close 方法关闭游标,释放任何相关的资源。一旦关闭,游标将无法用于进一步的操作。
主要特点:它是幂等的(可以安全地调用多次),释放数据库锁,并有助于防止资源泄漏。正确的游标管理对于数据库应用程序至关重要。
基本游标关闭
此示例演示了在传统的 try-finally 块中使用 Cursor.close 的基本用法,以确保清理。
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
try:
cursor.execute("SELECT * FROM users")
for row in cursor:
print(row)
finally:
cursor.close() # Explicitly close the cursor
conn.close()
游标在 finally 块中关闭,以确保即使在执行期间发生异常也会发生。此模式保证资源清理。
虽然现代 Python 经常使用上下文管理器,但了解显式关闭对于遗留代码或自定义资源管理场景非常重要。
使用带有上下文管理器的游标
游标可以用作上下文管理器,以便自动清理。这是现代 Python 代码中推荐的方法。
import sqlite3
with sqlite3.connect('example.db') as conn:
with conn.cursor() as cursor: # Cursor as context manager
cursor.execute("SELECT name, age FROM users")
print(cursor.fetchall())
# Cursor automatically closed here
# Connection automatically closed here
with 语句确保在块退出时正确关闭连接和游标,即使发生错误也是如此。 这更简洁、更安全。
嵌套上下文管理器优雅地处理连接和游标清理。内部游标上下文首先关闭,然后是连接上下文。
具有上下文管理器的多个游标
此示例展示了如何在单个连接中使用上下文管理器管理多个游标。
import sqlite3
with sqlite3.connect('inventory.db') as conn:
with conn.cursor() as items_cursor:
items_cursor.execute("SELECT * FROM items")
items = items_cursor.fetchall()
with conn.cursor() as sales_cursor:
sales_cursor.execute("SELECT * FROM sales")
sales = sales_cursor.fetchall()
print(f"Total items: {len(items)}, Total sales: {len(sales)}")
每个游标都在自己的上下文块中进行管理,确保使用后正确清理。 连接保持打开状态以进行所有操作,直到外部块退出。
当您需要用于不同查询的单独游标,但又想维护单个事务范围时,此模式非常有用。
带有错误处理的游标关闭
此示例演示了在面对潜在错误时正确的游标清理。
import sqlite3
try:
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM non_existent_table")
results = cursor.fetchall()
except sqlite3.Error as e:
print(f"Database error: {e}")
finally:
if 'cursor' in locals():
cursor.close() # Ensure cursor is closed
if 'conn' in locals():
conn.close() # Ensure connection is closed
finally 块在尝试关闭资源之前检查资源是否存在。 如果连接或游标创建失败,这将防止 AttributeError。
具有正确清理的强大错误处理对于生产数据库应用程序至关重要,可以防止资源泄漏。
函数中的游标关闭
此示例显示了在返回数据的函数中正确的游标管理。
import sqlite3
def get_user_count():
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
try:
cursor.execute("SELECT COUNT(*) FROM users")
count = cursor.fetchone()[0]
return count
finally:
cursor.close()
conn.close()
print(f"Total users: {get_user_count()}")
该函数确保在返回之前关闭游标和连接,即使发生错误也是如此。 这可以防止在调用该函数时出现资源泄漏。
对于使用数据库的函数,请始终在返回之前清理资源,以避免留下打开的连接或游标。
带有连接池的游标关闭
此高级示例演示了带有连接池的游标管理。
import sqlite3
from contextlib import contextmanager
@contextmanager
def db_connection():
conn = sqlite3.connect('app.db', timeout=10.0)
try:
yield conn
finally:
conn.close()
@contextmanager
def db_cursor(conn):
cursor = conn.cursor()
try:
yield cursor
finally:
cursor.close()
# Usage:
with db_connection() as conn:
with db_cursor(conn) as cursor:
cursor.execute("UPDATE stats SET visits = visits + 1")
conn.commit()
此示例为连接和游标管理创建可重用的上下文管理器。 嵌套结构确保正确的清理顺序。
像这样的连接池模式在处理许多数据库操作的 Web 应用程序或服务中非常有用。
带有行工厂的游标关闭
此示例将游标管理与行工厂配置结合起来。
import sqlite3
with sqlite3.connect('products.db') as conn:
conn.row_factory = sqlite3.Row # Enable named column access
with conn.cursor() as cursor:
cursor.execute("SELECT id, name, price FROM products")
for row in cursor:
print(f"{row['id']}: {row['name']} (${row['price']:.2f})")
游标继承连接的行工厂设置。 上下文管理器确保在使用后正确关闭连接和游标。
使用 sqlite3.Row 提供命名列访问,同时通过上下文管理器保持正确资源清理的优势。
最佳实践
- 始终关闭游标: 使用上下文管理器进行自动清理
- 及时关闭游标: 完成后释放资源
- 顺序很重要: 在连接之前关闭游标
- 首选上下文管理器: 比手动关闭调用更安全
- 关闭前检查: 在 finally 块中,验证是否存在
资料来源
作者
列出所有 Python 教程。