【问题标题】: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 是一个运算符,而不是一个函数 - 您不需要用括号将右操作数括起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多