Python操作MySQL遇SQL语法错误,语句在Workbench可正常执行
问题分析与解决办法
问题根源
错误提示显示SQL语句被额外双引号包裹,说明传递给cursor.execute()的SQL字符串实际是"SELECT * from Librarian.Documents WHERE Doc_Id = 3;"(带首尾双引号),MySQL无法识别这种带引号的完整语句,因此触发1064语法错误。
解决步骤
- 检查SQL模板配置:查看
dbcfg.sql['getDocDetails']对应的原始SQL模板,确认是否被双引号包裹。比如配置文件中如果写成:
需去掉首尾双引号,改为:"SELECT * from Librarian.Documents WHERE Doc_Id = {_id};"SELECT * from Librarian.Documents WHERE Doc_Id = {_id}; - 验证实际生成的SQL:在执行
cursor.execute(sql)前添加调试代码,打印SQL的原始字符串(用repr()可显示隐藏的引号):print(repr(sql)) # 若输出为'"SELECT ...;"'则说明字符串带双引号 - 临时修复(不推荐长期使用):如果暂时无法修改配置,可在替换后去除首尾双引号:
sql = dbcfg.sql['getDocDetails'].replace('{_id}', str(doc_id)).strip('"')
后续优化(推荐)
尽快切换到参数化查询,彻底避免字符串插值带来的语法问题和SQL注入风险,示例代码:
sql = "SELECT * from Librarian.Documents WHERE Doc_Id = %s;" self.cursor.execute(sql, (doc_id,))
内容的提问来源于stack exchange,提问作者R S
相关产品推荐
相关产品推荐

