如何在Python中使用可选参数正确执行SQL查询?

时间:2014-03-13 22:37:02

标签: python mysql sql

我有一个应用程序,允许用户在一组数据上设置过滤器。例如:

cursor.execute("select * from products where price <= %s", (price))

但我希望有可选的过滤元素。例如:

cursor.execute("select * from products where price <= %s and size >= %s and weight <= %s", (price,size,weight))

构建此查询的正确方法是什么?可以使用%通配符作为值,但这似乎非常hacky。用户可以指定一个,多个或不指定过滤器。

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,使用像SQLAlchemy这样的ORM可以在一般意义上解决您的问题。但是,如果您由于某种原因不想使用ORM并且想要构建它,则可以使用动态SQL。这是您为每个请求手动构建sql的地方。它通常被认为是一种不良的做法,并且可能导致许多安全漏洞,特别是注射,如果不仔细的话。现在,如果您不必担心任何列为NULL,那么您可以设置默认值,例如:

SELECT * FROM products WHERE price < %s AND weight > %s 

你的参数可能是(假设没有过滤器)

(9999999999999999,-1)

然而,过滤器价格&gt; 500

(500, -1)

等等。另一种方式会更有活力。

sql = "SELECT * FROM products"
filters = None
if price:
   filters = filters + " price > %s"
if filters:
   sql = "{0} WHERE {1}".format(sql, filters)