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
相关产品推荐
相关产品推荐

