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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:55:17