在 MySQLdb 游标的 SQL 语句中使用 %%s%
Posted
技术标签:
【中文标题】在 MySQLdb 游标的 SQL 语句中使用 %%s%【英文标题】:Use %%s% in a SQL statement of a MySQLdb cursor 【发布时间】:2021-08-19 02:19:02 【问题描述】:我想从我的数据库中选择COLUMN_NAME
值包含字符串的数据,示例如下:
SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('%foobar%')
上述 SQL 语句应从表 mytable
中选择,其中 COLUMN_NAME
包含 foobar
(区分大小写)
但是 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,))
关于如何让它工作的任何帮助?
【问题讨论】:
【参考方案1】:对于使用百分号 %
的参数化查询,参数值应包含可以用 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,))
【讨论】:
非常感谢!【参考方案2】: 老实说,我没有用 MySQLdb 测试过,但通常你可以通过加倍来转义格式字符串中的 `%`。因此
value = "foobar"
cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('%%%s%%')", (value,))
应该可以。
更新:
我提出的解决方案不起作用,因为查询是使用mogrify()
准备的,它使用literal()
。literal
总是添加单引号'
。所以查询变为LOWER('%'foobar'%')
,无效。
请考虑Parfait's solution。
【讨论】:
这使它成为LOWER(%'foobar'%)
,而它应该是LOWER('%foobar%')
我从缺少引号的问题中复制了第二个...我认为(编辑)现在应该这样做,对吗?
现在实际上是LOWER('%'foobar'%')
。如果我能去掉foobar
之间的引号,就会亮起来。我可以让它 LOWER("%%%s%%")
让它工作,但它会寻找 'foobar'
而我希望它寻找 foobar
哦,抱歉,我没有正确阅读。恐怕这是不可能的。给我一些时间来检查这个并用解释更新我的答案。
@Mario 我的答案是正确的。 %
可以在这里参数化,没有任何问题。对不起,我现在也学到了一些东西。以上是关于在 MySQLdb 游标的 SQL 语句中使用 %%s%的主要内容,如果未能解决你的问题,请参考以下文章
Python:MySQLdb中sql语句'in'和‘like’要注意的一些问题