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

