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

Python F字符串中转义双引号时单引号自动转义的问题

问题描述

在Python中编写SQL Server查询语句时,使用双引号包裹字符串并转义内部双引号后,发现调试器显示后续单引号被自动添加了反斜杠转义。由于SQL Server不会将反斜杠视为转义字符,而是当作查询的一部分,因此担心这会导致SQL执行异常。

代码示例:

query = f"select apples,\
bananas,\
cranberries,\
durian \
from schema.\"database_name/table_name\" \
where SNAPSHOT_PERIOD = '123' and parameter IN('abc') \
group by POB_ID"

print(query)

调试器显示的结果(字符串repr()形式):

'select apples,bananas,cranberries,durian from schema."database_name/table_name" where SNAPSHOT_PERIOD = \\'123\\' and parameter IN(\\'abc\\')'

期望的SQL语句:

select apples,bananas,cranberries,durian from schema."database_name/table_name" where SNAPSHOT_PERIOD = '123' and parameter IN('abc') group by POB_ID
解决方案
  • 澄清调试器显示的本质
    调试器输出的是Python字符串的repr()形式,其中的反斜杠是Python用来标记字符串内部单引号的转义符号,实际字符串内容中并不存在这些反斜杠。执行print(query)后,输出的内容就是符合期望的SQL语句,不会包含反斜杠,可以直接用于SQL Server查询。

  • 优化字符串写法提升可读性
    为了避免转义符带来的混淆,推荐以下两种写法:

    1. 用单引号包裹整个SQL字符串,内部双引号无需转义,单引号用反斜杠转义:
    query = 'select apples, bananas, cranberries, durian from schema."database_name/table_name" where SNAPSHOT_PERIOD = \'123\' and parameter IN(\'abc\') group by POB_ID'
    
    1. 用三引号(单/双均可)定义字符串,内部单、双引号都无需转义,还能保留换行格式,可读性更强:
    query = '''select apples,
    bananas,
    cranberries,
    durian 
    from schema."database_name/table_name" 
    where SNAPSHOT_PERIOD = '123' and parameter IN('abc') 
    group by POB_ID'''
    
  • 注意SQL注入风险
    如果后续需要向SQL语句中动态插入变量,绝对不要直接使用F字符串拼接,这会带来严重的SQL注入风险。应该使用数据库驱动提供的参数化查询功能(例如pyodbc中用?作为占位符)。

内容的提问来源于stack exchange,提问作者hypnoticbanana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:37:30