You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:15:45