MySQL语法错误1064求助:Python执行SQL语句时触发语法报错
解决你的MySQL语法错误问题
嘿,我来帮你排查这个SQL语法问题!先看看你遇到的情况:
你执行了这段Python代码:
cur = mysql.connection.cursor() cur.execute("""Select Qid, Username, Question, StdName, SubName, PostDate, AnsCount from user inner join Textual_Question, subjects, standard where Textual_Question.Qid = {} and user.Uid = Textual_Question.Uid and Textual_Question.Subject = subjects.Subkey and Textual_Question.standard =standard.StdKey""".format(Qid))
然后触发了报错:
(1064, "您的SQL语法存在错误;请查阅对应MySQL服务器版本的手册,了解在'} and\n user.Uid = Textual_Question.Uid and\n Textual_Question.Subje'附近使用的正确语法")
问题出在哪?
主要有两个核心问题:
- 多表连接语法混乱:你把
INNER JOIN和逗号分隔表的写法混在一起用了,MySQL无法正确解析这种混合写法。INNER JOIN后面应该只跟单个表,然后用ON指定连接条件,其他关联表需要单独用JOIN语句声明,而不是直接用逗号堆在后面。 - 直接用
format插入参数有风险且易出错:如果Qid是字符串类型,你这样写会因为缺少引号报错;更严重的是,这会导致SQL注入漏洞,非常不安全。
修正后的代码
我给你调整成正确的写法,同时解决安全问题:
cur = mysql.connection.cursor() # 使用规范的JOIN语法+参数化查询 sql_query = """ SELECT Qid, Username, Question, StdName, SubName, PostDate, AnsCount FROM Textual_Question INNER JOIN user ON user.Uid = Textual_Question.Uid INNER JOIN subjects ON Textual_Question.Subject = subjects.Subkey INNER JOIN standard ON Textual_Question.standard = standard.StdKey WHERE Textual_Question.Qid = %s """ # 用参数化方式传递Qid,避免SQL注入和语法问题 cur.execute(sql_query, (Qid,))
为什么这么改?
- 清晰的JOIN结构:把
Textual_Question作为主表,每个关联表都用INNER JOIN ... ON明确指定连接条件,MySQL能轻松解析这种标准语法,不会再出现解析错误。 - 参数化查询:用
%s作为占位符,把Qid放在execute的第二个参数元组里,MySQL会自动处理参数的类型和引号,既避免了语法错误,又彻底杜绝了SQL注入风险。
内容的提问来源于stack exchange,提问作者ngc tech tips Unboxing
相关产品推荐
相关产品推荐

