如何在Python中手动转义SQL字面量

0 投票
1 回答
1766 浏览
提问于 2025-04-18 03:33

我正在尝试为我的应用程序写一个非常高级的查询构建器。目前我在使用 psycopg2,但它似乎没有办法单独处理一个字面量,必须把它放在一个已经写好的大查询里。

有没有什么通用的模块可以做到这一点?我好像没有太多(如果有的话)选择。

1 个回答

2

你其实不需要去处理字面量的转义,这就是参数化语句的用处。psycopg2 支持参数化语句,无论是可计划的语句(比如插入、更新、删除、查询)还是不可计划的语句(比如创建表、创建索引等)。

你应该始终使用参数化语句,而不是直接把字面量放进查询字符串里。

看起来 psycopg2 也提供了一些引用函数,特别是 psycopg2.extensions.adapt

不过,对于现代的 PostgreSQL 来说,这其实很简单;你可以遵循和标识符相同的规则,只不过用 ' 替代 "

  • 如果字符串中有零字节(\x00),就把字符串截断到零字节之前;
  • 字符串中的每个 ' 都替换成 ''
  • 在字符串的开头和结尾加上 '

就这样。反斜杠没有特殊含义,所以没有其他需要转义的东西。

你只需要确保 standard_conforming_strings 是启用的(可以用 SELECT current_setting('standard_conforming_strings') 来检查,如果没有启用就抛出异常,因为这些规则对于旧式字符串和 E'' 字符串是完全错误的)。

如果能在 psycopg2 中有 escape_literalescape_identifier 函数就太好了,可以考虑提交一个补丁。

另外可以参考:

撰写回答