Python MySQL 参数化查询与 LIKE 语句中的 % 通配符冲突
我在执行这个查询时遇到了问题:
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 也应该有效……