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

Tkinter GUI更新MySQL学生数据报错及日期无法添加求助

解决Tkinter学生管理GUI中MySQL更新报错"Not all parameters were used in sql statement"的问题

错误原因分析

  1. 参数与SQL字段顺序完全错位:SQL语句中UPDATE的字段顺序和传入的参数列表顺序不匹配,导致MySQL无法将参数正确绑定到对应字段,触发"Not all parameters were used"错误。
  2. askyesno返回值判断错误:messagebox.askyesno()返回布尔值True/False,原代码用upadate > 0判断会引发类型错误,且提交、关闭连接等逻辑位置错误,未确认更新也会执行。
  3. 日期格式不兼容:若self.var_dob.get()获取的日期格式不符合MySQLDATE类型要求(如DD/MM/YYYY),会导致日期无法写入。

修正后的代码

def update_data(self):
    if (
        self.var_dep.get() == "Select Department"
        or self.var_std_name.get() == ""
        or self.var_std_id.get() == ""
    ):
        messagebox.showerror("Error", "All fields are required", parent=self.root)
    else:
        try:
            confirm_update = messagebox.askyesno(
                "Update", "Do you want to update this student details", parent=self.root
            )
            if confirm_update:
                conn = mysql.connector.connect(
                    host="localhost",
                    username="root",
                    password="K2412@",
                    database="face_recognizerr",
                )
                my_cursor = conn.cursor()
                # 严格对齐SQL字段与参数顺序
                my_cursor.execute(
                    """update student 
                       set Dep=%s, course=%s, year=%s, semester=%s, 
                           Division=%s, Roll=%s, Gender=%s, Dob=%s, 
                           Email=%s, Phone=%s, Address=%s, Lecturer=%s, PhotoSample=%s 
                       where student_id=%s""",
                    (
                        self.var_dep.get(),          # 对应Dep
                        self.var_course.get(),       # 对应course
                        self.var_year.get(),         # 对应year
                        self.var_semester.get(),     # 对应semester
                        self.var_div.get(),          # 对应Division
                        self.var_roll.get(),         # 对应Roll
                        self.var_gender.get(),       # 对应Gender
                        self.var_dob.get(),          # 对应Dob
                        self.var_email.get(),        # 对应Email
                        self.var_phone.get(),        # 对应Phone
                        self.var_address.get(),      # 对应Address
                        self.var_lecturer.get(),     # 对应Lecturer
                        self.var_radio1.get(),       # 对应PhotoSample
                        self.var_std_id.get()        # 对应where条件的student_id
                    ),
                )
                conn.commit()
                messagebox.showinfo(
                    "Success",
                    "Student details successfully updated",
                    parent=self.root
                )
                self.fetch_data()
                conn.close()
            else:
                return

        except Exception as es:
            messagebox.showerror("Error", f"Due To:{str(es)}", parent=self.root)

额外的日期格式处理(若需要)

如果你的日期输入框是DD/MM/YYYY格式,需要转换为MySQL支持的YYYY-MM-DD:

from datetime import datetime

# 在获取日期参数时添加格式转换
dob_input = self.var_dob.get()
try:
    dob_formatted = datetime.strptime(dob_input, "%d/%m/%Y").strftime("%Y-%m-%d")
except ValueError:
    messagebox.showerror("Error", "Invalid date format, use DD/MM/YYYY", parent=self.root)
    return

# 之后在参数列表中用dob_formatted替代self.var_dob.get()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:56:10