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

Python操作SQL Server触发DatabaseError未定义及异常捕获失败问题

问题描述

编写Python脚本遍历Microsoft SQL Server中的数据表时,90%的场景可使用同一条查询语句,剩余10%因表头字段不同需要切换查询。运行时Spyder抛出DatabaseError: Execution failed on sql错误,提示列名无效;尝试通过try/except捕获该异常处理时,又报NameError: 'DatabaseError' is not defined,使用except Exception as e也没有生效。

初始实现代码
query1 = """
        SELECT count(distinct column1) [Col1]
        ,SUM(CASE WHEN column2 <> '' THEN 1 ELSE 0 END)[Col2]
        ,SUM(CASE WHEN colum3 <> '' THEN 1 ELSE 0  END)[Col3]
        FROM {query_table} with (nolock)
        """
query2 = """
        SELECT count(distinct column_1) [Col1]
        ,SUM(CASE WHEN column_2 <> '' THEN 1 ELSE 0 END)[Col2]
        ,SUM(CASE WHEN column3 <> '' THEN 1 ELSE 0  END)[Col3]
        FROM {query_table} with (nolock)
        """     

for table in processed_df['Table Name']:
    row_df = processed_df[processed_df['Table Name'] == table]
    try:
       query_results = pd.read_sql_query(query1.format(query_table = table), conn)
  
    except DatabaseError:
       query_results = pd.read_sql_query(query2.format(query_table = table), conn)
解决方案

实际使用pyodbc连接数据库,虽然报错显示DatabaseError,但直接捕获该类无效,改为捕获pyodbc.Error即可,还可增加兜底except分支,修改后代码参考如下:

try:
       # 优先执行第一种查询逻辑
       query_results = pd.read_sql_query(query1.format(query_table = table), conn)
  
    except pyodbc.Error: 
       # 触发异常后执行第二种查询逻辑
       query_results = pd.read_sql_query(query2.format(query_table = table), conn)
    
    except:
       # 所有逻辑都失效时的兜底处理
       # 可自定义日志记录、跳过当前表等操作
       pass

该方案可解决同类pyodbc连接数据库时pandas数据库异常捕获失效的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:36:01