Python执行含反斜杠单引号的SQL查询报语法错误如何解决
Python对接SQL Server查询时特殊字符(反斜杠+单引号)的正确处理方案
报错核心原因
之前的写法存在两个关键错误:
- SQL Server语法规则中,字符串常量内部的单引号必须转义为两个连续单引号,而非用反斜杠转义。之前写的
'IDL\\DOC\\'TAB_...'片段中,\\'会被SQL解析为字符串结束标记,后续的TAB_会被判定为非法语法片段,直接触发102语法错误。 - 直接用
.format()拼接SQL语句属于不规范写法,既需要同时兼顾Python字符串转义、SQL语法转义两层规则极易出错,还存在SQL注入风险。
推荐方案:使用pyodbc原生参数化查询
pyodbc的参数化查询会自动完成所有特殊字符的转义适配,不需要手动处理反斜杠、单引号的转义逻辑,从根源避免语法错误,代码如下:
from datetime import date # 第一步:在Python侧构造需要匹配的完整字段值,仅需遵守Python本身的字符串语法即可 # Python中字面反斜杠需要写为双反斜杠,这是Python语法要求,和SQL无关 match_year = date.today().year target_cie = "TAB_" target_tablecode = f"IDL\\DOC'TAB_'\\'{match_year}'FV'\\' ' " # 第二步:用?作为参数占位符写SQL,参数以元组形式传入execute方法,不要手动拼接进SQL字符串 c.execute( "SELECT Num FROM Table WHERE cie = ? AND tablecode = ?", (target_cie, target_tablecode) )
手动拼接写法(仅作原理演示,生产环境禁止使用)
如果一定要手动拼接SQL,必须同时满足两层转义要求:
- Python字符串层面:每个字面反斜杠写为
\\ - SQL语法层面:每个字面单引号写为
''(两个连续单引号)
示例代码:
from datetime import date match_year = date.today().year # 注意单引号全部替换为双单引号,反斜杠在Python中双写 sql_statement = f"SELECT Num FROM Table WHERE cie = 'TAB_' AND tablecode = 'IDL\\DOC''TAB_''\\''{match_year}''FV''\\'' ' '" c.execute(sql_statement)
转义规则说明:SQL Server默认不将反斜杠识别为转义字符,仅对字符串内的单引号有转义要求。手动拼接需要同时处理两层转义逻辑,漏改任意一处就会触发语法错误,因此无特殊情况必须使用参数化查询。
内容的提问来源于stack exchange,提问作者IT-SRL
相关产品推荐
相关产品推荐

