使用pyodbc最佳实践的动态SQL查询WHERE子句

时间:2019-11-15 00:49:14

标签: python sql pyodbc

我正在尝试生成类似的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”的第一个示例名称搜索查询?

2 个答案:

答案 0 :(得分:0)

您可以做到

if($x){ $value[] = $x}

if($y{ $value[] = $y} 

$sql = "SELECT * FROM mytable WHERE colx = ? AND coly = ?";     

$stmt ->pdo->prepare($sql);  

$stmt->execute($value);

答案 1 :(得分:0)

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

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

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

尽管如此,我还是建议您研究功能更全的ORM,该ORM为您提供查询构建器。看看this question的想法。