Python游标(Cursor)详解 - 从入门到精通 | Python数据库教程
- Python
- 2025-07-28
- 198
Python游标(Cursor)详解教程
掌握数据库操作的核心技术
什么是数据库游标?
在Python数据库编程中,游标(Cursor)是与数据库交互的主要对象,它允许我们执行SQL语句并处理结果集。
游标的主要功能:
- 执行SQL查询和命令
- 从结果集中检索数据
- 管理事务(提交/回滚)
- 调用存储过程
创建游标的基本步骤
- 建立数据库连接
- 创建游标对象
- 执行SQL语句
- 处理结果
- 关闭游标
- 关闭数据库连接
基本示例:SQLite游标操作
import sqlite3
# 1. 连接到数据库(不存在则创建)
conn = sqlite3.connect('mydatabase.db')
# 2. 创建游标对象
cursor = conn.cursor()
# 3. 执行SQL命令
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)")
# 4. 插入数据
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Alice', 'alice@example.com'))
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('Bob', 'bob@example.com'))
# 5. 提交事务
conn.commit()
# 6. 查询数据
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
# 7. 打印结果
for row in rows:
print(f"ID: {row[0]}, Name: {row[1]}, Email: {row[2]}")
# 8. 关闭游标和连接
cursor.close()
conn.close()
游标的常用方法
execute()
执行SQL语句,支持参数化查询防止SQL注入
# 安全的方式(参数化查询)
cursor.execute("SELECT * FROM users WHERE name = ?", (name,))
# 危险的方式(SQL注入风险)
cursor.execute(f"SELECT * FROM users WHERE name = '{name}'")
fetchall()
获取查询结果的所有行,返回列表
cursor.execute("SELECT * FROM users")
all_rows = cursor.fetchall()
for row in all_rows:
print(row)
fetchone()
获取查询结果的下一行
cursor.execute("SELECT * FROM users")
first_row = cursor.fetchone()
print(first_row)
fetchmany(size)
获取指定数量的结果行
cursor.execute("SELECT * FROM users")
# 获取前5行
some_rows = cursor.fetchmany(5)
for row in some_rows:
print(row)
MySQL游标操作示例
import mysql.connector
from mysql.connector import Error
try:
# 1. 创建数据库连接
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
if conn.is_connected():
# 2. 创建游标对象
cursor = conn.cursor()
# 3. 执行SQL查询
cursor.execute("SELECT * FROM employees")
# 4. 获取列名
columns = [desc[0] for desc in cursor.description]
print("Columns:", columns)
# 5. 获取所有结果
records = cursor.fetchall()
print("Total rows:", cursor.rowcount)
# 6. 遍历结果
for row in records:
print(row)
# 7. 关闭游标和连接
cursor.close()
conn.close()
except Error as e:
print("数据库错误:", e)
finally:
if conn.is_connected():
cursor.close()
conn.close()
游标使用的最佳实践
- 始终使用参数化查询 - 防止SQL注入攻击
- 使用上下文管理器 - 确保资源正确释放
- 限制返回的数据量 - 使用LIMIT子句处理大数据集
- 及时关闭游标和连接 - 避免资源泄漏
- 处理事务 - 明确提交或回滚事务
使用上下文管理器的示例
import sqlite3
# 使用with语句自动管理连接和游标
with sqlite3.connect('mydatabase.db') as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM users")
for row in cursor:
print(row)
# 事务自动提交(如果没有错误)
# 连接自动关闭
常见问题与解决方案
1. 游标已关闭错误
错误信息: sqlite3.ProgrammingError: Cannot operate on a closed cursor.
解决方案: 确保在游标关闭后不再尝试使用它。使用上下文管理器可以避免此问题。
2. 数据修改未提交
现象: INSERT/UPDATE/DELETE操作后数据库没有变化。
解决方案: 确保在执行修改操作后调用conn.commit()。某些数据库在关闭连接时会自动提交,但最好显式提交。
3. 获取大数据集导致内存不足
现象: 使用fetchall()处理大型结果集时内存耗尽。
解决方案: 使用fetchmany()分批处理数据,或者使用游标作为迭代器:
cursor.execute("SELECT * FROM large_table")
for row in cursor: # 游标本身是可迭代对象
process_row(row)
总结
Python中的游标是数据库操作的核心组件,掌握游标的使用是进行有效数据库编程的关键。通过本教程,您应该已经了解了如何创建游标、执行SQL查询、处理结果集以及避免常见错误。无论使用SQLite、MySQL还是其他数据库,这些基本概念都是通用的。
记住: 始终使用参数化查询,及时关闭资源,合理管理事务!
本文由LinYan于2025-07-28发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20256704.html
发表评论