aiomysql 游标(Cursor)使用完全指南
游标基础概念
在数据库编程中,游标(Cursor)是一个非常重要的概念,它充当了数据库操作的工作区,允许我们执行SQL语句并处理返回的结果集。aiomysql作为Python的异步MySQL客户端库,提供了完整的游标实现。
游标的主要特点包括:
- 通过连接对象的cursor()方法创建
- 与创建它的连接绑定,生命周期与连接一致
- 同一连接创建的多个游标之间不隔离,一个游标的修改会立即被其他游标看到
- 不同连接创建的游标是否隔离取决于连接的隔离级别
基本游标操作
创建游标
import asyncio
import aiomysql
async def example():
conn = await aiomysql.connect(host='localhost', user='root',
password='', db='test')
cursor = await conn.cursor() # 创建普通游标
# 执行SQL操作...
await cursor.close()
conn.close()
执行SQL查询
使用execute()方法执行SQL语句:
await cursor.execute("SELECT * FROM users WHERE id=%s", (user_id,))
获取结果
aiomysql提供了多种获取结果的方法:
fetchone(): 获取下一行fetchmany(size): 获取指定数量的行fetchall(): 获取所有行
游标属性详解
aiomysql的游标对象提供了多个有用的属性:
- description: 描述结果集的元数据,包含列名、类型等信息
- rowcount: 返回受影响或产生的行数
- rownumber: 当前行的索引(0-based)
- arraysize: fetchmany()默认获取的行数(默认为1)
- lastrowid: 最后插入行的自增ID
- closed: 游标是否已关闭
高级游标类型
DictCursor字典游标
默认游标返回元组形式的结果,而DictCursor返回字典形式,更易于使用:
cursor = await conn.cursor(aiomysql.DictCursor)
await cursor.execute("SELECT name, age FROM users")
row = await cursor.fetchone()
print(row['name'], row['age']) # 通过列名访问
还可以自定义字典类型:
class AttrDict(dict):
def __getattr__(self, name):
return self.get(name)
class AttrDictCursor(aiomysql.DictCursor):
dict_type = AttrDict
cursor = await conn.cursor(AttrDictCursor)
row = await cursor.fetchone()
print(row.name) # 通过属性访问
SSCursor流式游标
对于大型结果集,可以使用无缓冲的流式游标(SSCursor),它不会一次性加载所有数据到内存:
cursor = await conn.cursor(aiomysql.SSCursor)
await cursor.execute("SELECT * FROM large_table")
while True:
row = await cursor.fetchone()
if not row:
break
# 处理每一行数据
流式游标的特点:
- 内存占用小
- 只支持向前遍历
- 无法预先知道总行数
- 每个fetch操作都需要网络请求
存储过程调用
aiomysql支持通过callproc()方法调用存储过程:
await cursor.callproc('my_procedure', [param1, param2])
result = await cursor.fetchall()
注意:存储过程的OUT/INOUT参数需要通过查询@_procname_n变量获取。
游标滚动
游标支持相对和绝对滚动:
await cursor.scroll(5, mode='relative') # 向前移动5行
await cursor.scroll(0, mode='absolute') # 回到开头
最佳实践
- 总是显式关闭游标和连接
- 大型查询使用流式游标
- 字典游标提高代码可读性
- 使用参数化查询防止SQL注入
- 考虑使用上下文管理器管理游标生命周期
通过合理使用aiomysql提供的各种游标类型和功能,可以高效地处理各种MySQL数据库操作场景。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



