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

MySQL查询中WHERE与AND用法及Python Tkinter拼接SQL语法错误排查

问题分析
  • 语法错误:日期字段值未加单引号。你手动执行的SQL中date ='2021-11-05'有单引号包裹日期值,但Python拼接字符串时没有加单引号,生成的SQL会把日期识别为2021减11减05的数值表达式,SQL解析到该位置后认为WHERE条件提前结束,后续的AND关键字被判定为非法字符,这也是报错信息指向AND附近语法错误的直接原因。
  • 参数缺失:报错信息显示LIMIT关键字后没有数值,说明limit_var.get()获取到的lim变量为空,没有传入有效的LIMIT数值,导致SQL不完整。
  • 安全风险:直接拼接用户输入的参数构造SQL,存在SQL注入漏洞,属于高危写法。
  • 隐性逻辑漏洞:没有做查询结果判空处理,如果查询无返回结果,list(zip(*result))会直接抛出解包错误。
修正方案
  1. 优先使用MySQL Connector官方提供的参数化查询方式,不要手动拼接SQL字符串,驱动会自动处理转义和字符串类型值的引号包裹问题,同时避免SQL注入风险。
  2. 执行查询前先校验所有参数非空,且LIMIT、patient_id参数转换为整数类型,避免空参数或类型错误。
  3. 增加空结果集的判断逻辑,避免无数据时解包报错。
修正后的代码示例
from tkinter import DISABLED

def analyze_voltage_time():
    # 获取参数并去除首尾空格
    lim = limit_var.get().strip()
    start = s_date_var.get().strip()
    _id = id_selector.get().strip()
    
    # 基础非空校验,可根据需求自行补充弹窗提示逻辑
    if not all([lim, start, _id]):
        return
    # 数值类型参数合法性校验
    try:
        lim = int(lim)
        pat_id = int(_id[:9])
    except (ValueError, IndexError):
        return

    # 使用参数化查询,%s为占位符,不需要手动加引号
    query = "SELECT voltage, time FROM patient_results_tbl WHERE date = %s AND patient_id = %s LIMIT %s"
    # 参数按占位符顺序放入元组,传入execute方法的第二个参数
    mycursor.execute(query, (start, pat_id, lim))
    result = mycursor.fetchall()

    # 查询结果判空,避免解包失败
    if not result:
        return
    
    voltage, time = list(zip(*result))
    # 用extend替代循环append简化代码
    voltage_container.extend(voltage)
    time_container.extend(str(t) for t in time)
    
    my_ax1.plot(time_container, voltage_container)        
    my_canvas1.draw_idle()
    analyse_btn['state'] = DISABLED

内容的提问来源于stack exchange,提问作者Kennerdol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:54:02