PyMySQL中isinstance检测InternalError失败问题排查
pymysql InternalError类型判断失败的原因及解决
核心问题分析
你遇到的判断失败,主要有两个关键原因:
1. 错误的类型对比写法
你用type(result) == type(InternalError)是完全错误的逻辑:
type(InternalError)得到的是类的类型(即<class 'type'>)type(result)得到的是实例的类型(即<class 'pymysql.err.InternalError'>)
这两者根本不是同一层级的对象,自然永远不相等。正确的对比应该是type(result) is InternalError或者保持使用isinstance(result, InternalError)。
2. 类对象的模块导入不一致
即使你用了正确的判断写法,仍可能失败,最常见的原因是同一个类名对应了内存中不同的类对象:
- 你的调用代码和
execute_sql所在模块,可能从不同路径导入了pymysql(比如一个用全局site-packages的pymysql,另一个用项目本地的pymysql副本) - pymysql模块被重复加载(比如手动调用
reload(pymysql)) - 项目中存在和
pymysql同名的文件/目录,干扰了正常模块导入
这种情况下,两个InternalError类虽然名字和模块路径看起来一样,但内存地址不同,isinstance会判定为不同类型。
验证与解决方法
- 验证类对象一致性
在调用代码和execute_sql所在模块中分别添加打印:
# 调用代码中 from pymysql.err import InternalError print(f"调用模块的InternalError: id={id(InternalError)}, module={InternalError.__module__}") # execute_sql所在模块中 from pymysql.err import InternalError print(f"execute_sql模块的InternalError: id={id(InternalError)}, module={InternalError.__module__}")
如果两个id值不同,说明是模块导入路径不一致导致的类对象重复。
- 解决导入冲突
- 检查
sys.path,移除多余的pymysql相关路径,确保只有一个正确的pymysql被导入 - 删除项目中与
pymysql同名的文件/目录 - 避免手动重载pymysql模块
- 临时替代方案
如果暂时无法解决导入问题,可以通过模块和类名双重判断:
if (result.__class__.__name__ == 'InternalError' and result.__module__ == 'pymysql.err'): return "Insert has failed"
内容的提问来源于stack exchange,提问作者c8999c 3f964f64
相关产品推荐
相关产品推荐

