在 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,))
我想从我的数据库中 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,))
关于如何让它工作的任何帮助?
因此
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,))