Python+Tkinter+MySQL查询报ValueError解包错误及SQL条件匹配问题求解
问题原因及解决方案
核心问题原因
- SQL字段引用语法错误:查询语句中用单引号包裹
date、patient_id字段名,单引号在SQL中用于标识字符串常量,这会导致SQL实际执行的是判断字符串'date'是否等于传入的日期值,永远返回假,因此查询结果为空。 - 日期格式不匹配:数据库
date字段存储格式为YYYY-MM-DD,但tkcalendar返回的日期格式为DD/MM/YYYY,两种格式的字符串无法匹配,导致条件不成立。 - MySQL Workbench测试语句错误:直接写
date = 13/11/2021时,MySQL会将13/11/2021识别为除法运算,计算得到的小数值和date字段完全不匹配,因此返回0行;替换为OR后返回数据是因为仅patient_id条件生效,本质是只按患者ID查询,并非两个条件都匹配成功。
修复方案
1. 转换日期格式
引入datetime模块,将tkcalendar返回的DD/MM/YYYY格式日期转换为和数据库一致的YYYY-MM-DD格式:
from datetime import datetime # 原有获取日期逻辑后新增格式转换 start = get_date2() start_date = datetime.strptime(start, "%d/%m/%Y").strftime("%Y-%m-%d")
2. 修正SQL查询语句
字段名不要用单引号包裹,如需转义请使用反引号`:
# 修正后的查询语句 query = "SELECT voltage, time FROM patient_results_tbl WHERE `date` = %s AND `patient_id` = %s" mycursor.execute(query, (start_date, pat_id))
3. 新增空结果校验
查询后先判断结果是否为空,避免解包报错:
result = mycursor.fetchall() # 新增空结果判断 if not result: print("未查询到对应患者的指定日期数据") # 可在此处添加Tkinter弹窗提示逻辑 return # 原有解包逻辑 voltage, time = list(zip(*result))
测试验证
在MySQL Workbench中执行正确的测试语句可验证匹配逻辑:
SELECT voltage, time FROM patient_results_tbl WHERE `date` = '2021-11-13' AND `patient_id` = '785393661';
内容的提问来源于stack exchange,提问作者Kennerdol
相关产品推荐
相关产品推荐

