首页 > 解决方案 > SQLAlchemy 动态过滤器查询

问题描述

我被困在这个数据库搜索问题上:我有一个带有不同复选框的 PyQt5 小部件。它们中的每一个都代表我数据库中的一列。例如,“工人姓名”和“部门”。复选框放置在 lineEdits 附近,因此用户在此 lineEdit 中插入一些文本,而不是单击复选框和“查找”按钮。

假设用户在 lineEdit 中插入“John”,然后按“worker_name”复选框并通过

session.query(Doc).filter_by('worker_name'=text_from_lineEdit)

如果用户在两个 lineEdits 中插入文本并按下两个复选框('worker_name' 和 'department'),查询将如下所示:

session.query(Doc).filter_by('worker_name'=text_from_lineEdit, 'department'=text_from_lineEdit_2)

但是,如果我有很多复选框(与 DB 表中的列一样多)并且我不知道哪些会被按下,哪些不会。在这种情况下我应该如何形成查询?我的意思是我将拥有“wrk_name”、“department”和“date”,用户只能按“worker_name”或“worker_name”+“日期”或所有复选框进行搜索。

有没有办法根据给出的参数动态形成数据库查询,哪些参数不包含在“filter_by”/“过滤器中或只是忽略”。

请分享您对可能实现此类功能的想法。谢谢你的时间。

标签: pythonsqlalchemypyqt5

解决方案


请记住,python 中的一切都是对象,因此您可以动态构建过滤器列表并将其传递给 filter() (或任何其他)方法。一些伪代码来说明这个概念:

flist = []
for inp in input:
    flist.append(Table.column == inp.property)

db.query(Table).filter(*flist)

推荐阅读