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

