PyQt5动态拼接SQL查询实现表格过滤 避免多层if冗余判断
PyQt5 动态生成多条件筛选SQL方案
核心思路
放弃多层嵌套if判断,采用基础查询+动态追加条件的模式:先写好必选条件(如日期范围)的基础SQL,再将所有可选筛选项和数据库字段做映射,遍历判断用户选中值有效时,自动追加WHERE条件和对应参数,最终一次性生成适配当前筛选规则的SQL语句,全程使用参数化查询避免注入风险。
具体实现代码
直接修改原有filtertable方法即可,不需要改动其他初始化逻辑:
def filtertable(self): self.tabella_registrazioni.clear() self.tabella_registrazioni.blockSignals(True) # 读取必选日期参数 startdate = self.input_dal.date().toPyDate() enddate = self.input_al.date().toPyDate() # 初始化带必选条件的基础SQL、参数列表 # 注:已修正原代码中日期大小判断写反的问题 base_sql = "SELECT * FROM Viaggi WHERE DataDDT >= ? AND DataDDT <= ?" params = [startdate, enddate] # 配置可选筛选项与数据库字段的映射关系,后续新增筛选项直接加在这里即可 optional_filter_config = [ ("Articolo", self.filtro_articolo.currentText()), ("Magazzino", self.filtro_magazzino.currentText()), ("Ragione_sociale", self.filtro_cliente.currentText()), ("Targa", self.filtro_targa.currentText()), ("Autista", self.filtro_autista.currentText()) ] # 统一空值标记,后续修改空选项规则只需要改这里 EMPTY_OPTION = " " # 遍历可选配置,动态追加有效条件 for db_column, selected_value in optional_filter_config: # 加strip()避免选项前后多余空格导致空值判断失效 if selected_value.strip() != EMPTY_OPTION.strip(): base_sql += f" AND {db_column} = ?" params.append(selected_value) # 执行查询,c为你已实例化的数据库游标 c.execute(base_sql, tuple(params)) query_result = c.fetchall() # 后续保留你原有表格填充数据的逻辑即可 # self.fill_table(query_result)
方案优势
- 无冗余代码:不管用户选0个、1个还是全部5个可选条件,都用同一套逻辑生成SQL,不需要写任何嵌套if分支
- 易维护:后续新增、删除筛选项只需要修改
optional_filter_config列表里的映射关系,不需要调整核心判断逻辑 - 安全:全程使用参数化查询,不存在SQL注入风险
- 容错性高:空值判断做了空格兼容,避免UI配置时的小失误导致筛选异常
内容的提问来源于stack exchange,提问作者IT-SRL
相关产品推荐
相关产品推荐

