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

时间:2014-10-23 20:19:12

标签: python mysql

我执行此操作的查询失败:

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 个答案:

答案 0 :(得分:1)

你可以使用额外的%

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

这显然是works for MySQLdb,我希望它也适用于python-mysql。 。

答案 1 :(得分:-1)

尝试使用格式。如果你有一个字符串,使用%s就可以使用{}。

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

这更好,并且符合新版本的python。而且,您可以在查询中感到恼火。