在 MySQLdb 游标的 SQL 语句中使用 %%s%

Use %%s% in a SQL statement of a MySQLdb cursor

我想从我的数据库中 select 数据,其中 COLUMN_NAME 值包含一个字符串,示例如下:

SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('%foobar%')

上面的 SQL 语句应该 select 来自 table mytable where COLUMN_NAME contains foobar (incase sensitive)

但是 foobar 是一个例子,我不确定如何在 Python MySQLdb 查询中实现它,同时转义将放置的值而不是 foobar

我尝试了以下方法,但它们的语法似乎不正确:

value = "foobar"
cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('%%s%')", (value,))
value = "foobar"
cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER(%%s%)", (value,))
value = "foobar"
cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('% %s %')", (value,))

关于如何让它工作的任何帮助?

老实说,我没有用 MySQLdb 测试过这个,但通常你可以通过将它加倍来转义格式字符串中的“%”。

因此

value = "foobar"
cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('%%%s%%')", (value,))

应该可以。


更新:

我提出的解决方案不起作用,因为查询是用 mogrify() which uses literal() 准备的。
literal 始终添加单引号 '。所以查询变为LOWER('%'foobar'%')并且无效。

请考虑

对于使用百分比符号 % 的参数化查询,参数值应包含可以使用 F 字符串插入的通配符:

# VALUE WITH WILDCARDS
value = "foobar"
param = f"%{value}%"

# PREPARED STATEMENT WITHOUT QUOTES
sql = "SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER(%s)"

# EXECUTE AND BIND PARAM
cursor.execute(sql, (param,))