如何在Python中手动转义SQL字面量
我正在尝试为我的应用程序写一个非常高级的查询构建器。目前我在使用 psycopg2,但它似乎没有办法单独处理一个字面量,必须把它放在一个已经写好的大查询里。
有没有什么通用的模块可以做到这一点?我好像没有太多(如果有的话)选择。
1 个回答
2
你其实不需要去处理字面量的转义,这就是参数化语句的用处。psycopg2
支持参数化语句,无论是可计划的语句(比如插入、更新、删除、查询)还是不可计划的语句(比如创建表、创建索引等)。
你应该始终使用参数化语句,而不是直接把字面量放进查询字符串里。
看起来 psycopg2 也提供了一些引用函数,特别是 psycopg2.extensions.adapt
。
不过,对于现代的 PostgreSQL 来说,这其实很简单;你可以遵循和标识符相同的规则,只不过用 '
替代 "
:
- 如果字符串中有零字节(
\x00
),就把字符串截断到零字节之前; - 字符串中的每个
'
都替换成''
; - 在字符串的开头和结尾加上
'
。
就这样。反斜杠没有特殊含义,所以没有其他需要转义的东西。
你只需要确保 standard_conforming_strings
是启用的(可以用 SELECT current_setting('standard_conforming_strings')
来检查,如果没有启用就抛出异常,因为这些规则对于旧式字符串和 E''
字符串是完全错误的)。
如果能在 psycopg2
中有 escape_literal
和 escape_identifier
函数就太好了,可以考虑提交一个补丁。
另外可以参考: