如何使用pymysql的cursorclass方法解决"TypeError: __init__() missing required positional arguments"错误

问题现象与背景

在使用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),
    # 其他连接参数...
)

最佳实践建议

  1. 始终调用父类的__init__方法
  2. 在自定义游标中添加类型提示
  3. 使用**kwargs处理额外参数
  4. 编写单元测试验证游标行为

性能优化技巧

自定义游标时应注意:

  • 避免在__init__中执行耗时操作
  • 使用@lru_cache缓存常用查询结果
  • 合理设置arraysize提高批量获取效率

常见问题扩展

问题 解决方案
游标无法获取结果 检查是否调用了fetch系列方法
事务不生效 确认是否正确处理了autocommit参数

版本兼容性说明

不同pymysql版本对游标的处理有所差异:

  • 0.9.x: 基础游标功能
  • 1.0+: 增强型游标支持