gpt4 book ai didi

python - 生成 SQL "IN"子句 : how to safely handle input + empty value lists?

转载 作者:行者123 更新时间:2023-11-28 21:30:36 24 4
gpt4 key购买 nike

在我的 Python 代码中,我经常发现自己执行以下操作(使用 DB-API):

yValues = pickInterestingValuesOfY()

sql = "..." # includes a clause stating that "y must be in yValues"

c.execute(sql, yValues)

最后,执行的 SQL 可以像这样简单:

SELECT x FROM table1 WHERE y IN (1,2,3);

问题在于 y (1,2,3) 的可能值集是在运行时确定的。

我有两个担忧:

  1. 在 yValues 为空的情况下生成有效的 SQL(“WHERE y IN ()”是无效的 SQL)
  2. 如果值来自不受信任的来源,请注意 SQL 注入(inject)

为了解决 (2),我必须让 DB-API 实际上将 yValues 插入 SQL 语句中。所以我最终得到了以下复杂的解决方案:

def inClause(columnName, values):

if len(values):
placeHolders = ','.join( ['%s'] * len(values) )
sql = "%s IN (%s)" % (columnName, placeHolders)
else:
sql = "FALSE"
return "(%s)" % sql

# get a db-api cursor called c
c.execute("SELECT x FROM table1 WHERE %s;" % inClause('y', yValues), yValues)

这似乎正确地解决了上述两个问题。然而,我不敢相信这个笨重的解决方案就是它所需要的。

您如何处理此类查询?我是否缺少一种更优雅的方法来做到这一点?

我不是在寻找 ORM。

(我正在使用 MySQL,所以如果有一些神奇的 mysql 非标准开关默默地接受“WHERE y IN ()”作为有效,请告诉我,问题 (1) 将得到处理。)

最佳答案

对于 in 子句,始终包含一个不在列表中的值(例如负整数)。

关于python - 生成 SQL "IN"子句 : how to safely handle input + empty value lists?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2055258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com