我有一个应用程序,允许用户在一组数据上设置过滤器。例如:
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。用户可以指定一个,多个或不指定过滤器。
答案 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)