有没有办法动态构建sql查询

时间:2021-07-15 19:15:39

标签: python sqlite

我正在使用 SQLite3 和 tkinter 在 Python 中编写一个数据库管理器,并且我正在尝试构建一个查询函数。我的数据库中的每个元素都有几个属性:“name”、“path”、“seen”、“quality”、“franchise”、“genre”和“tags”。

如果可能,我希望用户能够在 GUI 中选择某些选项,然后创建对数据库的请求,但问题是用户应该能够选择任何或所有这些属性被过滤掉或进入查询。例如,一个查询可能会询问数据库中名称为“Tony”、特许经营权“toy Story”和类型“Action”的所有对象,而另一个查询可能只需要所有看到的对象为“是”。

我在这方面遇到了很多麻烦,虽然我很想这样做,但我无法硬编码 SQL Select 语句部分的每个排列,而且我觉得无论如何我都有更好的方法没看见我试过设置一个“默认语句”: SELECT * FROM objects WHERE 然后像 genre IS ? 一样添加它,如果特许经营权比 AND franchise IS ? 重要,但是我遇到了我不知道如何动态格式化替换的问题。我很确定这可以做到,所以我很乐意提供帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您绝对走在正确的道路上。考虑建立一个 WHERE 子句列表和一个平行的替换列表。在这个例子中,我使用的是字符串,但你明白了:

subs = []
where = []
where.append( "name = ?" )
subs.append( "Tony" )
where.append( "franchise = ?" )
subs.append( "Toy Story" )

sql = "SELECT * FROM movies WHERE " + (" AND ".join(where)) + ";"
query = cursor.execute( sql, subs )