首页 > 解决方案 > 使用 pyodbc 最佳实践的动态 SQL 查询 WHERE 子句

问题描述

我正在尝试生成一个 SQL 查询,例如

SELECT FirstName,
       LastName
 FROM Names  
 WHERE (FirstName LIKE '%FNameA%' OR FirstName LIKE '%FNameB%' ....OR FirstName LIKE '%FNameN%')
  AND (LastName LIKE '%LNameA%'OR LastName LIKE '%LNameB%'..... OR LastName LIKE '%LNameN%')

在 python 中动态并使用 pyodbc 在 Microsoft SQL 服务器上运行它。我只是想知道在这里避免 SQL 注入漏洞的最佳做法是什么。

例如,对于输入数量已知的查询,我可以使用绑定参数将任何输入转义到查询中

"SELECT * FROM mytable WHERE colx = ? AND coly = ?", (x, y).

有没有办法使用参数来构造具有任意数量的“Fnames”和“LNames”的第一个示例名称搜索查询?

标签: pythonsqlpyodbc

解决方案


当您说应该使用绑定参数来防止 SQL 注入时,您是正确的。如果需要,您可以简单地在 for 循环中构建 SQL:

firstNameSql = []
for name in firstNames:
    firstNameSql.append('FirstName like '%?%')

sql = "SELECT FirstName, LastName FROM Names WHERE (" + firstNameSql.join(' OR ') + ")"

不过,我建议您研究一个功能更全面的 ORM,它可以为您提供查询构建器。看看这个问题的想法。


推荐阅读