You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时,误转义了某些字符?比如单引号或者关键字?

四、逐步调试自定义模块

给你个实用的调试步骤:

  1. 在自定义模块的DB.query()方法里,先把要执行的SQL打印出来,确认和测试用的SQL完全一致。
  2. 在执行SQL的代码块里添加异常捕获,打印详细的错误信息:
    try:
        cur.execute(query)
        res = cur.fetchall()
        print("查询结果:", res)
        return res
    except mysql.connector.Error as err:
        print(f"查询出错: {err}")
        raise
    
  3. 直接在自定义模块里临时替换成原生的连接代码(就是你测试用的那段),看看能不能拿到结果,逐步缩小问题范围。

总之,既然原生驱动能正常工作,问题肯定出在自定义模块的封装细节里,从连接参数、异常处理、结果获取这几个方向入手排查,应该很快就能找到问题所在。

备注:内容来源于stack exchange,提问作者BenjiBob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:08:12