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

Python使用try/except处理KeyError:跳过未配置校验的表

解决未配置UNIQUE_VALIDATION规则的表触发KeyError的问题

你的问题核心在于:当tables列表中的表(比如table3)未在UNIQUE_TABLES节点配置时,直接通过键访问配置会抛出KeyError,而原来的异常处理仅覆盖了数据库操作环节,完全没处理配置读取的关键步骤。

下面是调整后的代码,能直接跳过无配置的表,避免异常:

def DBCount(self, db_count_dict):
    schema = self.config["data-validation"]["database"]["schema"]
    unique_tables_config = self.config["data-validation"]["RULES"]["RULE_UNIQUE_VALIDATION"]["UNIQUE_TABLES"]
    
    # 先检查当前表是否在UNIQUE_VALIDATION配置中,无配置直接跳过
    if self.table not in unique_tables_config:
        print(f"表 {self.table} 未配置UNIQUE_VALIDATION规则,跳过计数")
        return db_count_dict
    
    unique_cols = unique_tables_config[self.table].split(",")
    db_count_dict[self.table] = {}

    for col in unique_cols:
        cnxn = None
        try:
            cnxn = SourceValidation.getDBConnection(self.env)
            print(f"UNIQUE COL: {col}")
            unique_count_query = f"SELECT COUNT(DISTINCT {col}) as unique_count FROM {schema}.{self.table}"
            df = pd.read_sql(unique_count_query, cnxn)
            db_count_dict[self.table][col] = str(df['unique_count'].values[0])
        except Exception as e:
            print(f"处理列 {col} 时出错: {str(e)}")
        finally:
            # 确保数据库连接关闭,避免连接泄漏
            if cnxn:
                cnxn.close()

    return db_count_dict

关键修改点说明:

  • 提前拦截无配置表:先取出UNIQUE_TABLES配置,通过in判断当前表是否存在配置,不存在直接返回,从根源避免KeyError
  • 优化循环逻辑:直接遍历列名元素,替代索引遍历,代码更简洁易读
  • 完善资源管理:添加finally块确保数据库连接关闭,避免长期占用连接资源
  • 提升代码可读性:用f-string替代字符串拼接,语句更直观

内容的提问来源于stack exchange,提问作者noride_togo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:35:48