我有一个来自外部源的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注入。
我要么对此过度思考,要么试图解决无法解决的问题。我高度怀疑是前者。正确的方法是什么?