使用PyMySQL执行SQL查询遇UnboundLocalError问题求助
问题排查:关联查询学生ID时出现UnboundLocalError
问题场景
需求:通过Python中用户输入的User_Fname(名)和User_Lname(姓),先从user_information表获取User_ID,再以此关联student_info表查询对应的Student_ID。
编写的SQL语句如下:
Find_Student_ID = "SELECT student_info.Student_ID FROM student_info JOIN user_information ON user_information.User_ID = student_info.User_ID WHERE user_information.User_Fname = '"+ str(User_Fname) + "' AND user_information.User_Fname = '"+ str(User_Lname)+"'"
运行时抛出UnboundLocalError,提示局部变量Student_ID未关联值,怀疑JOIN和ON部分存在问题。
核心问题排查
WHERE条件字段匹配错误
你在WHERE子句中把User_Lname也用User_Fname字段进行匹配,这会导致查询永远返回空结果——不可能存在一个用户的名和姓完全相同且等于同一个字段值的情况。因为SQL查不到数据,后续代码尝试提取Student_ID时,该变量未被赋值,直接触发UnboundLocalError。JOIN逻辑无问题
你的JOIN和ON条件是正确的:user_information.User_ID = student_info.User_ID的关联逻辑符合需求,这部分不需要修改。SQL注入风险
直接用字符串拼接构造SQL语句存在严重的SQL注入漏洞,必须改用参数化查询来避免这个问题,同时也能避免字符串转义带来的错误。
修正后的代码示例
以Python的MySQL驱动为例,改用参数化查询并修正WHERE条件:
# 构造参数化SQL语句 Find_Student_ID = """ SELECT student_info.Student_ID FROM student_info JOIN user_information ON user_information.User_ID = student_info.User_ID WHERE user_information.User_Fname = %s AND user_information.User_Lname = %s """ # 执行查询并传入参数 cursor.execute(Find_Student_ID, (User_Fname, User_Lname)) result = cursor.fetchone() # 处理查询结果,避免变量未赋值 if result: Student_ID = result[0] else: Student_ID = None print("未找到匹配的学生信息")
如果使用其他数据库驱动(如SQLite、PostgreSQL),参数占位符会略有不同(比如SQLite用?,PostgreSQL用%s),核心逻辑一致。
内容的提问来源于stack exchange,提问作者blackus1811
相关产品推荐
相关产品推荐

