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

MySQL报错1064(42000)SQL语法错误,无法定位错误原因求解决

错误诱因&修复方案

你触发1064语法错误存在两处独立问题:

1. delete_data方法参数传递错误

mysql.connector的execute()方法要求第二个参数为可迭代的参数序列,你直接传入单个值时,程序会把字符串按字符拆分迭代,和SQL语句中单个%s占位符数量不匹配,触发语法报错。
修复方式:把传入的值包装为元组,末尾加逗号明确声明为元组类型:

# 错误写法
cur.execute("DELETE FROM students WHERE roll_no=%s",self.Roll_No_var.get())
# 正确写法
cur.execute("DELETE FROM students WHERE roll_no=%s", (self.Roll_No_var.get(),))

2. search_data方法SQL拼接错误

你写的SQL语句中where关键字后面没有加空格,和后续拼接的字段名直接连在一起,会生成select * from students wherename like '%xxx%'这类非法语法;同时直接拼接用户输入存在SQL注入风险,建议改为参数化查询写法:

# 错误写法
cur.execute("select * from students where"+str(self.search_by.get())+" like '%"+str(self.search_text.get())+"%'")
# 正确写法(先拼接合法的字段位置,再用参数化传值避免注入)
search_field = str(self.search_by.get())
# 先校验字段名是否合法,避免恶意传入非法字段
allow_fields = ['roll_no', 'name', 'class', 'phone'] # 替换为你表的实际字段名
if search_field not in allow_fields:
    return
sql = f"SELECT * FROM students WHERE {search_field} LIKE %s"
cur.execute(sql, (f"%{str(self.search_text.get())}%",))

修复后完整代码

def delete_data(self):
    con = mysql.connector.connect(host="localhost", user="root", password="Satpute@223", database="stm")
    cur = con.cursor()
    # 修复参数传递格式
    cur.execute("DELETE FROM students WHERE roll_no=%s", (self.Roll_No_var.get(),))
    con.commit()
    con.close()
    self.fetch_data()
    self.clear()

def search_data(self):
    con = mysql.connector.connect(host="localhost", user="root", password="Satpute@223", database="stm")
    cur = con.cursor()
    # 修复SQL拼接逻辑+参数化查询
    search_field = str(self.search_by.get())
    # 这里替换为你students表允许搜索的实际字段名,避免非法传参
    allow_search_fields = ['roll_no', 'name', 'gender', 'class', 'contact']
    if search_field not in allow_search_fields:
        con.close()
        return
    sql = f"SELECT * FROM students WHERE {search_field} LIKE %s"
    cur.execute(sql, (f"%{str(self.search_text.get())}%",))
    rows = cur.fetchall()
    if len(rows) != 0:
        self.Student_table.delete(*self.Student_table.get_children())
        for row in rows:
            self.Student_table.insert('', END, values=row)
    con.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 21:24:02