使用 psycopg2 转义 Postgres 的 SQL“LIKE”值

2024-05-22

psycopg2 是否有转义 a 值的函数LIKEPostgres 的操作数?

例如,我可能想匹配以字符串“20% of all”开头的字符串,所以我想写这样的内容:

sql = '... WHERE ... LIKE %(myvalue)s'
cursor.fetchall(sql, { 'myvalue': escape_sql_like('20% of all') + '%' }

是否有现有的类似转义sql我可以在这里插入的功能吗?

(类似的问题如何显式引用字符串值 (Python DB API/Psycopg2) https://stackoverflow.com/questions/309945/how-to-quote-a-string-value-explicitly-python-db-api-psycopg2,但我在那里找不到答案。)


是的,这真是一团糟。默认情况下,MySQL 和 PostgreSQL 都使用反斜杠转义符。如果您还使用反斜杠而不是使用参数化再次转义字符串,这将是一个可怕的痛苦,并且根据 ANSI SQL:1992,它也是不正确的,它表示默认情况下在正常字符串转义之上没有额外的转义字符,并且因此无法包含文字% or _.

我认为如果您关闭反斜杠转义符(它们本身不符合 ANSI SQL),简单的反斜杠替换方法也会出错,使用NO_BACKSLASH_ESCAPEMySQL 中的 sql_mode 或standard_conforming_stringsPostgreSQL 中的 config.conf(PostgreSQL 开发人员现在已经威胁要在几个版本中这样做)。

唯一真正的解决方案是使用鲜为人知的LIKE...ESCAPE语法来指定显式转义字符LIKE-图案。在 MySQL 和 PostgreSQL 中,它被用来代替反斜杠转义,使它们符合其他人的做法,并提供一种有保证的方式来包含带外字符。例如与=作为逃避的标志:

# look for term anywhere within title
term= term.replace('=', '==').replace('%', '=%').replace('_', '=_')
sql= "SELECT * FROM things WHERE description LIKE %(like)s ESCAPE '='"
cursor.execute(sql, dict(like= '%'+term+'%'))

这适用于 PostgreSQL、MySQL 和 ANSI SQL 兼容的数据库(当然,以 paramstyle 为模,该参数在不同的数据库模块上会发生变化)。

MS SQL Server/Sybase 可能仍然存在问题,这显然也允许[a-z]-风格的字符组LIKE表达式。在这种情况下,您还想转义文字[字符与.replace('[', '=[')。然而,根据 ANSI SQL,转义不需要转义的字符是无效的! (啊!)因此,尽管它可能仍然可以在真实的 DBMS 上运行,但您仍然不符合 ANSI 标准。叹...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 psycopg2 转义 Postgres 的 SQL“LIKE”值 的相关文章

随机推荐