问题现象与背景
在使用Python的pymysql库操作MySQL数据库时,开发者经常遇到这样的错误提示:
TypeError: __init__() missing 1 required positional argument: 'connection'
这个错误通常发生在尝试使用自定义游标类(cursorclass)时,特别是当继承pymysql.cursors.Cursor类但没有正确处理初始化参数的情况下。
错误原因深度分析
根本原因在于游标类初始化机制。pymysql的游标类需要接收以下关键参数:
connection: 数据库连接对象(必需)cursor: 底层游标类型(可选)echo: 是否输出SQL日志(可选)
当开发者自定义游标类时,如果没有在__init__方法中正确处理这些参数,就会触发上述错误。
完整解决方案
方案1:正确继承基类
import pymysql.cursors
class CustomCursor(pymysql.cursors.Cursor):
def __init__(self, connection):
super().__init__(connection)
def execute(self, query, args=None):
# 自定义执行逻辑
return super().execute(query, args)
方案2:使用工厂函数
def get_custom_cursor(conn):
class CustomCursor(pymysql.cursors.Cursor):
def execute(self, query, args=None):
# 自定义处理
return super().execute(query, args)
return CustomCursor(conn)
方案3:使用functools.partial
from functools import partial
connection = pymysql.connect(
cursorclass=partial(CustomCursor, extra_param=value),
# 其他连接参数...
)
最佳实践建议
- 始终调用父类的
__init__方法 - 在自定义游标中添加类型提示
- 使用
**kwargs处理额外参数 - 编写单元测试验证游标行为
性能优化技巧
自定义游标时应注意:
- 避免在
__init__中执行耗时操作 - 使用
@lru_cache缓存常用查询结果 - 合理设置
arraysize提高批量获取效率
常见问题扩展
| 问题 | 解决方案 |
|---|---|
| 游标无法获取结果 | 检查是否调用了fetch系列方法 |
| 事务不生效 | 确认是否正确处理了autocommit参数 |
版本兼容性说明
不同pymysql版本对游标的处理有所差异:
- 0.9.x: 基础游标功能
- 1.0+: 增强型游标支持