当前位置:首页 > Python > 正文

Python游标(Cursor)详解 - 从入门到精通 | Python数据库教程

Python游标(Cursor)详解教程

掌握数据库操作的核心技术

什么是数据库游标?

在Python数据库编程中,游标(Cursor)是与数据库交互的主要对象,它允许我们执行SQL语句并处理结果集。

游标的主要功能:

  • 执行SQL查询和命令
  • 从结果集中检索数据
  • 管理事务(提交/回滚)
  • 调用存储过程

创建游标的基本步骤

  1. 建立数据库连接
  2. 创建游标对象
  3. 执行SQL语句
  4. 处理结果
  5. 关闭游标
  6. 关闭数据库连接

基本示例: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还是其他数据库,这些基本概念都是通用的。

记住: 始终使用参数化查询,及时关闭资源,合理管理事务!

发表评论