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

3 投票
1 回答
1408 浏览
提问于 2025-04-17 22:13

我有一个应用程序,用户可以对一组数据设置过滤条件。例如:

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))

那么,构建这个查询的正确方法是什么呢?虽然可以使用 % 作为值,但这看起来有点不太正规。用户可以选择一个、多个或者不使用任何过滤条件。

1 个回答

0

正如评论中提到的,使用像SQLAlchemy这样的ORM工具可以从整体上解决你的问题。不过,如果你出于某种原因不想使用ORM,而是想自己动手做这个,可以考虑使用动态SQL。这种方式就是你手动为每个请求构建SQL语句。虽然这样做可以实现你的需求,但通常被认为是一种不太好的做法,因为如果不小心,可能会导致很多安全问题,尤其是SQL注入。现在,如果你不需要担心某些字段是NULL的话,你可以设置默认值,比如:

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

而你的参数可以是(假设没有过滤条件)

(9999999999999999,-1)

但是如果有过滤条件,比如价格大于500

(500, -1)

等等。另一种方法会更灵活一些。

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

撰写回答