【问题标题】:PostgreSQL database query with parametrized column input具有参数化列输入的 PostgreSQL 数据库查询
【发布时间】:2020-08-18 01:36:09
【问题描述】:
我正在尝试使用 python 和 postgreSQL 进行数据库查询,该查询从下拉列表和文本字段中获取用户输入。下拉列表中的输入应该确定要查询哪个列以获取文本输入。它可以在不使用下拉菜单输入的情况下按需工作,但在使用时不返回任何内容。
str = request.args.get("str")
type = request.args.get("type")
query = "%" + str + "%"
books = db.execute("SELECT * FROM books WHERE :type ILIKE (:query)", {"type": type, "query": query}).fetchmany(100)
【问题讨论】:
标签:
python
sql
postgresql
select
where-clause
【解决方案1】:
您不能将列名作为参数传递给查询。您的代码发生的情况是 Postres 将参数 :type 理解为文字字符串,并尝试将其与另一个参数匹配。这不是你想要的。
因此,您需要将列名连接到查询字符串中。这意味着您需要在应用程序端执行正确的验证在此之前,否则您会将代码暴露给 SQL 注入;我希望您应该能够根据固定的值列表验证列名。
str = request.args.get("str")
type = request.args.get("type")
# !! perform parameter validation !!
query = "%" + str + "%"
books = db.execute("SELECT * FROM books WHERE " + type + " ILIKE :query", {"query": query}).fetchmany(100)
附注:ILIKE 是一个运算符,而不是一个函数 - 您不需要用括号将右操作数括起来。