Python自定义MySQL查询模块执行递归CTE返回null,但原生mysql.connector测试正常
Python自定义MySQL查询模块执行递归CTE返回null,但原生mysql.connector测试正常
看起来你已经精准定位到问题根源了——直接用mysql.connector不管是纯Python模式(use_pure=True)还是C扩展模式(use_pure=False)都能正常返回递归CTE的结果,说明问题肯定出在你自己封装的DB查询插件里。我给你梳理几个大概率的排查方向:
一、检查自定义模块的连接参数是否和测试代码一致
你在原生测试里明确指定了一堆连接参数(host、user、passwd、database、port、ssl_disabled、use_pure),但自定义模块里的连接配置可能和这些有差异:
- 有没有可能自定义模块用了不同的数据库用户?比如该用户没有
session表的查询权限? - SSL设置是否一致?有些环境下关闭SSL会导致连接异常,但没抛出错误直接返回空?
use_pure参数有没有设置?虽然测试里两种模式都正常,但不排除自定义模块的默认设置有问题?- 时区配置是否一致?比如
NOW()在自定义模块的连接里返回的时区和测试环境不同,导致递归条件d < NOW()不成立?
二、排查自定义模块的fetchAll()实现逻辑
你提到自定义模块是封装了cursor并返回fetchAll(),这里可能存在几个坑:
- 是不是在执行
cur.execute(query)后,没有正确调用cur.fetchall()?比如封装时写错了方法名(比如写成fetchAll()而不是小写的fetchall())? - 有没有可能cursor在获取结果前就被提前关闭了?比如封装时用了错误的上下文管理器,或者手动调用了
cur.close()? - 有没有处理查询异常?比如执行SQL时出现了错误(比如表名拼写错误、权限问题),但模块没有捕获异常,直接返回了
null?
三、检查SQL语句的一致性
虽然你贴的SQL看起来和测试代码一致,但还是要确认:
- 自定义模块里执行的SQL是不是完全和测试代码一样?比如有没有在拼接SQL时出现了大小写问题?你测试的SQL里CTE定义的是
date_ranges(小写),但UNION ALL里引用的是Date_Ranges(大写)——虽然MySQL默认不区分大小写,但部分Linux环境下的MySQL如果开启了大小写敏感配置,可能会出问题? - 有没有可能自定义模块在处理SQL时,误转义了某些字符?比如单引号或者关键字?
四、逐步调试自定义模块
给你个实用的调试步骤:
- 在自定义模块的
DB.query()方法里,先把要执行的SQL打印出来,确认和测试用的SQL完全一致。 - 在执行SQL的代码块里添加异常捕获,打印详细的错误信息:
try: cur.execute(query) res = cur.fetchall() print("查询结果:", res) return res except mysql.connector.Error as err: print(f"查询出错: {err}") raise - 直接在自定义模块里临时替换成原生的连接代码(就是你测试用的那段),看看能不能拿到结果,逐步缩小问题范围。
总之,既然原生驱动能正常工作,问题肯定出在自定义模块的封装细节里,从连接参数、异常处理、结果获取这几个方向入手排查,应该很快就能找到问题所在。
备注:内容来源于stack exchange,提问作者BenjiBob
相关产品推荐
相关产品推荐

