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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:22:52