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查询。优化字符串写法提升可读性
为了避免转义符带来的混淆,推荐以下两种写法:- 用单引号包裹整个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'- 用三引号(单/双均可)定义字符串,内部单、双引号都无需转义,还能保留换行格式,可读性更强:
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
相关产品推荐
相关产品推荐

