MySQL查询在Workbench有结果,但在Flask应用中返回空列表
按以下步骤逐一排查:
1. 确认数据库连接环境一致
检查getCursor()返回的连接,是否和你在MySQL Workbench中使用的同一个数据库实例、同一个库。新手常出现代码连接测试库、Workbench连接生产库,或是本地/远程库混淆的情况。
可以在代码中添加查询当前数据库的语句验证:
connection.execute("SELECT DATABASE();") print(connection.fetchone())
将输出结果和Workbench中的当前数据库对比,确认是否一致。
2. 硬编码参数测试,排除变量问题
把代码中的jobNo替换为硬编码的5,直接执行查询:
connection.execute(sql, (5,)) partList = connection.fetchall() print(partList)
如果此时能返回结果,说明jobNo变量的实际值存在问题——比如看似是"5",但实际带有空格、换行符等隐藏字符。可以打印变量的类型和原始值确认:
print(type(jobNo), repr(jobNo)) # 正常输出应为 <class 'str'> '5' 或 <class 'int'> 5
若存在隐藏字符,可先用jobNo.strip()处理后再转换为int类型。
3. 检查事务配置
部分MySQL连接默认关闭自动提交(autocommit=False),虽然查询通常不受事务影响,但如果存在未提交的修改,可能导致查询无法获取最新数据。可以在执行查询前开启自动提交:
connection.autocommit(True)
也可以检查getCursor()函数的连接初始化代码,确认是否配置了autocommit。
4. 调试实际执行的SQL(仅用于排查)
如果使用PyMySQL,可手动拼接SQL(仅调试用,生产环境禁止字符串拼接SQL),对比和Workbench中执行的语句是否一致:
# 仅调试使用!生产环境必须用参数绑定 debug_sql = sql % (jobNo,) print(debug_sql) # 将此SQL复制到Workbench执行,查看是否返回结果
如果拼接后的SQL在Workbench中也返回空,说明变量值存在问题;若能返回结果,则可能是驱动的参数绑定逻辑异常,可尝试将%s替换为%d(仍推荐优先使用参数绑定)。
5. 检查表名/字段名的大小写(针对Linux服务器)
MySQL在Linux环境下默认区分表名大小写,Windows环境下不区分。若代码中写的是job_part,但实际数据库中的表名为Job_Part,在Linux环境下会查询不到数据(无报错,仅返回空列表)。可在Workbench中执行SHOW TABLES;确认表名的准确大小写。
内容的提问来源于stack exchange,提问作者Chris Greenwood

