Python MySQL 参数化查询与 LIKE 语句中的 % 通配符冲突

3 投票
2 回答
2924 浏览
提问于 2025-04-29 08:19

我在执行这个查询时遇到了问题:

cursor.execute("SELECT name FROM products WHERE rating > %s AND category like 'Automation %'", (3));

因为它对百分比的用法感到困惑,主要有两个原因——一个是作为LIKE通配符,另一个是作为Python MySQL数据库执行时的参数。

如果我这样运行这个查询,它就能正常工作:

cursor.execute("SELECT name FROM products WHERE rating > 3 AND category like 'Automation %'");

如果我按下面的方式运行查询,它也能正常工作:

cursor.execute("SELECT name FROM products WHERE rating > %s AND category = 'Automation '", (3));

但这并不是解决办法。我想同时使用通配符和参数。

我找到了一种变通方法,就是把我的常量通配符当作一个变量传入:

 cursor.execute("SELECT name FROM products WHERE rating > %s AND category like %s", (3, 'Automation %'));

这样可以工作,但我希望有一个更优雅的解决方案。我不想把常量当作变量传入。我的SQL语句可能在一个大查询中有很多LIKE语句。

暂无标签

2 个回答

-3

试着使用格式化。如果你有一个字符串,不要再用 %s 了,可以用 {} 来代替。

sql = "SELECT name FROM products WHERE rating > {0} AND category like 'Automation %'"
slq = sql.format(3)
cursor.execute(sql);

这样做更好,而且符合新版 Python 的要求。而且,用 % 来格式化字符串可能会让你觉得烦。

5

你可以试着用一个额外的 % 来解决这个问题:

cursor.execute("SELECT name FROM products WHERE rating > %s AND category like 'Automation %%'", (3));

这显然对 MySQLdb 有用,我觉得对 python-mysql 也应该有效……

撰写回答