使用pymssql查询时如何避免“EOL while scanning string literal”语法错误
解决pymssql中SQL查询的SyntaxError: EOL while scanning string literal错误
这个错误根本不是SQL语法的问题,而是你在Python里处理SQL字符串的方式不对!因为Python对多行字符串或者引号嵌套有严格的规则,而你的SQL语句在原生SQL环境能跑,说明SQL本身没问题,问题出在把SQL放到Python字符串里的写法上。
常见的错误原因和解决方法:
1. 多行SQL直接换行,未做处理
如果你的SQL是多行编写的,比如这样的错误写法:
# 错误:普通字符串直接换行,Python会认为字符串提前结束 query = 'SELECT column1, column2 FROM my_table WHERE column3 = 100'
Python会把换行符当成字符串的结束标记,直接抛出EOL错误。
正确写法:用三引号(''' 或 """)包裹多行字符串,这是Python处理多行文本最便捷的方式:
query = ''' SELECT column1, column2 FROM my_table WHERE column3 = 100 '''
2. 字符串里的引号嵌套冲突
如果你的SQL语句里用到了单引号(比如匹配字符串类型的字段值),而你在Python里也用单引号包裹整个SQL,就会导致引号提前闭合:
# 错误:单引号嵌套导致字符串提前结束 query = 'SELECT * FROM users WHERE username = 'Alice''
这里Python会把'SELECT * FROM users WHERE username = '当成一个完整字符串,后面的Alice''就会触发语法错误。
解决方法:
- 外层用双引号包裹SQL,内层保留单引号:
query = "SELECT * FROM users WHERE username = 'Alice'"
- 或者用转义符
\转义SQL里的单引号:
query = 'SELECT * FROM users WHERE username = \'Alice\''
3. 用反斜杠续行(不推荐,但可用)
如果你不想用三引号,也可以在每行末尾加反斜杠\,告诉Python这行字符串还未结束:
query = 'SELECT column1, column2 \ FROM my_table \ WHERE column3 = 100'
不过这种方式容易出错(比如反斜杠后面不小心加了空格),更推荐使用三引号的写法。
验证小技巧
你可以先把Python里的query变量打印出来,看看输出的SQL是不是和你在SQL环境里运行的完全一致。如果打印出来的SQL有截断、引号缺失等问题,那就是字符串处理环节出了问题。
内容的提问来源于stack exchange,提问作者Karachay
相关产品推荐
相关产品推荐

