Python使用pyodbc连接SQL Server调用存储过程获取结构化表格问题
解决方案
问题原因
你当前的代码存在两个可优化点,对应你遇到的两个异常表现:
- 第一条数据重复:进入while循环前你已经调用
cursor.fetchone()获取了第一行并加入列表,循环逻辑中又重复追加了一次第一行数据,导致结果重复 - 无正确列名:pyodbc的游标返回的行数据默认不会携带字段名,需要手动从游标的
description属性中提取列名映射到DataFrame
修复方案1:直接使用cursor处理(适合不想改读入逻辑的场景)
修正后的完整代码如下:
import pyodbc import pandas as pd server = '(LocalDb)\LocalDBDemo' database = 'Test' try: cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};' 'SERVER=' + server + ';' 'DATABASE=' + database + ';' 'trusted_connection=yes;' ) cursor = cnxn.cursor() storedProcedure = "Exec [dbo].[get_Movie]" cursor.execute(storedProcedure) # 直接获取所有行,不需要手动循环 rows = cursor.fetchall() # 从游标属性提取列名 columns = [col[0] for col in cursor.description] # 生成带正确列名的DataFrame df = pd.DataFrame.from_records(rows, columns=columns) print(df) except Exception as e: print("Error: %s" % e)
修复方案2:解决pd.read_sql_query大SQL报错问题
你提到的大SQL传入报错大概率是字符串拼接/换行处理不当导致的,使用Python三引号包裹多行SQL语句即可完美解决缩进、换行问题,不需要额外调整SQL本身:
import pyodbc import pandas as pd server = '(LocalDb)\LocalDBDemo' database = 'Test' try: cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};' 'SERVER=' + server + ';' 'DATABASE=' + database + ';' 'trusted_connection=yes;' ) # 三引号支持任意换行、缩进,直接粘贴你的大SQL即可 sql = """ Exec [dbo].[get_Movie] -- 这里可以直接粘贴你的完整长SQL,不需要调整原有缩进、换行格式 """ df = pd.read_sql_query(sql, cnxn) print(df) except Exception as e: print("Error: %s" % e)
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

