如何在Python代码中添加日志记录,捕获SQL操作失败的表名?
下面是修改后的代码,已添加异常处理和日志记录功能,确保单个表操作失败不影响整体流程,同时将失败的表名和错误信息写入日志文件:
import pandas as pd import logging # 根据你使用的数据库导入对应异常类,示例为PostgreSQL的psycopg2 import psycopg2 from psycopg2 import Error # 配置日志:输出到文件,设置日志级别和格式 logging.basicConfig( level=logging.ERROR, filename='table_operation_errors.log', format='%(asctime)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) try: sql = "SELECT * FROM TABLE" cur.execute(sql) df = pd.DataFrame.from_records(iter(cur), columns=[x[0] for x in cur.description]) my_dict = dict() for i in df['col1'].unique().tolist(): df_x = df[df['col1'] == i] my_dict[i] = df_x['col_table'].tolist() # 逐个处理每个schema和表,确保单表失败不影响全局 for k, tables in my_dict.items(): for v in tables: try: # 构造单条SQL语句并执行 sql = f"INSERT INTO {k}.{v} SELECT * FROM {k}.{v} where col2 = 1;" cur.execute(sql) # 若需事务提交,可在此添加 conn.commit(),根据数据库事务规则调整 except Error as e: # 记录失败的表名和具体错误信息 logger.error(f"操作表 {k}.{v} 失败: {str(e)}") # 若需回滚当前事务,可添加 conn.rollback() finally: # 确保数据库连接最终关闭,避免资源泄漏 if 'conn' in locals(): cur.close() conn.close()
关键修改说明
- 日志配置:将日志输出到
table_operation_errors.log文件,每条日志包含时间、级别和详细错误信息,方便后续排查问题 - 单表独立执行:放弃原批量执行逻辑,改为逐个表执行SQL,确保单个表操作失败不会中断整个流程
- 异常捕获:针对每个表的操作单独捕获数据库异常,完整记录失败的表标识(
schema.表名)和错误内容,比如你遇到的「表DIM_LOGS无可用数据」这类错误会被准确记录 - 连接管理:用
try-finally块确保数据库连接最终关闭,避免资源泄漏;若涉及事务,可根据需求添加提交或回滚逻辑
内容的提问来源于stack exchange,提问作者My80
相关产品推荐
相关产品推荐

