在 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%的主要内容,如果未能解决你的问题,请参考以下文章

MySQLdb操作数据库

何时使用 MySQLdb 关闭游标

Python:MySQLdb中sql语句'in'和‘like’要注意的一些问题

Python:MySQLdb中sql语句'in'和‘like’要注意的一些问题

python -- MySQLdb连接mysql数据库

Oracle游标sql语句代码块的优化