在sqlite3 / python中递归过滤行

时间:2019-06-17 20:07:53

标签: python sqlite

我有一个来自外部源的sqlite查询,该查询将具有未知数量的WHERE子句。子句的类型数量有限(我事先知道它们可以是哪种类型),但是在我实际收到查询之前,每种子句中有多少是未知的。

我认为这是一个容易解决的问题,直到我真正理解为止。

我可以想到几个可能的解决方案。我可以为每种类型的选择指定一个长的SELECT查询,其中包含许多不同的WHERE子句,并在没有足够的选择来填充它们时,用1=1填充这些子句。但这是丑陋的代码,当需要的空间比给定的要多时,它不会很好地响应。

我不能在纯SQL中执行此操作,而是使用递归的Python函数来遍历查询并依次过滤结果。这是无法成功运行的伪代码:

queries = (list of queries from external source)
return filter_results(conn.cursor(), (database), queries)

def filter_results(cursor, results, queries):
    if len(queries) == 0:
        return results_so_far
    cursor.execute("SELECT * FROM {} WHERE {}".format(results, queries.pop(0)))
    results = cursor.fetchall()
    return filter_results(cursor, results, queries)

如您所见,我在将数据库传递到函数中感到很困惑,而且我很清楚,我将无法将SQL查询传递给cursor.fetchall()的结果。在某个时候,我要么尝试在Python中模拟SQL,要么将自己暴露于SQL注入。

我要么对此过度思考,要么试图解决无法解决的问题。我高度怀疑是前者。正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

答案是使用查询构建工具。在这种情况下,PyPika是正确的工具。