SQLAlchemy动态过滤器查询

时间:2018-10-04 20:24:40

标签: python sqlalchemy pyqt5

我被困在这个数据库搜索问题上: 我有一个带有不同复选框的PyQt5小部件。它们每个代表我数据库中的一列。例如,“ worker_name”和“ department”。复选框位于lineEdits附近,因此用户可以在该lineEdit中插入一些文本,而不是单击checkBox和“查找”按钮。

比方说,用户在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)

但是,如果我有很多复选框(与数据库表中的列一样多),而我不知道将按下哪个复选框,该怎么办呢?在这种情况下,我应该如何形成查询?我的意思是我将拥有“ wrk_name”,“部门”和“ date”,并且用户只能通过“ worker_name”或“ worker_name” +“ date”或所有复选框进行搜索。

是否有任何方法可以动态地依赖于给定的参数以及不将其包含在'filter_by'/'filter中或仅忽略它们的参数来动态地形成数据库查询。

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

1 个答案:

答案 0 :(得分:1)

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

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

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