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

使用pyodbc捕获SQL错误码失败:无效表未触发异常求助

问题原因

你的代码里try/except仅包裹了cursor.execute操作,但TRUNCATE TABLE属于DDL语句,在pyodbc的事务机制下,部分数据库驱动会在提交事务时才抛出表不存在的异常——而你用with pyodbc.connect(...) as conn时,事务提交是在离开with块时自动执行的,这一步不在你的try范围内,所以异常没被捕获,脚本继续执行。

修复方案

把try/except的范围扩大,覆盖事务提交的环节,或者手动控制事务提交并捕获异常。

方案一:扩大try/except范围

error_count = 0
try:
    with pyodbc.connect(connection_string) as conn:
        with conn.cursor() as cursor:
            cursor.execute(f'TRUNCATE TABLE {table}')
    print("表截断操作执行成功")
except pyodbc.Error as ex:
    error_count += 1
    sqlstate = ex.args[0]
    print(sqlstate)
    send_email(0, "Truncate Table")
    exit()

方案二:手动控制事务提交

如果需要更精细的事务控制,可以手动调用commit()并将其纳入try块:

error_count = 0
with pyodbc.connect(connection_string) as conn:
    with conn.cursor() as cursor:
        try:
            cursor.execute(f'TRUNCATE TABLE {table}')
            conn.commit()  # 手动提交,表不存在的异常会在此触发
            print("表截断操作执行成功")
        except pyodbc.Error as ex:
            error_count += 1
            sqlstate = ex.args[0]
            print(sqlstate)
            send_email(0, "Truncate Table")
            conn.rollback()  # 回滚事务
            exit()
额外提醒

用f-string直接拼接表名存在SQL注入风险,若table参数来自不可信输入,建议先做合法性校验(比如预定义允许操作的表名单,或使用数据库系统的标识符转义规则处理表名)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:05:23