Pandas v2.0.0中read_sql_query返回单元格值重复列名问题求助
Pandas v2.0.0与pymssql配合使用read_sql_query的异常问题及解决办法
问题描述
在Pandas v2.0.0(2023年4月3日发布)中,使用pymssql连接执行read_sql_query函数时出现异常:结果集行数完整,但所有单元格值都重复显示列名;而在旧版本v1.5.3中功能完全正常。
复现代码
import pandas as pd import pymssql # 替换为实际连接参数 user = "your_user" password = "your_password" host = "your_host" db = "your_db" conn = pymssql.connect(user=user, password=password, host=host, database=db, as_dict=True, autocommit=True) result_set = pd.read_sql_query("select * from table", conn) print(result_set.head())
结果对比
- v2.0.0异常结果:
| Column A | Column B |
|---|---|
| Column A | Column B |
| Column A | Column B |
- v1.5.3正常结果:
| Column A | Column B |
|---|---|
| 1 | 2 |
| 3 | 4 |
环境版本:Python 3.10.5,Pandas 2.0.0
替代解决办法(无需降级Pandas)
1. 移除pymssql连接的as_dict=True参数
pymssql的as_dict=True会让游标返回字典格式的行数据,Pandas 2.0.0对这类游标数据的解析逻辑发生了变化。移除该参数后,游标默认返回元组格式数据,即可正常解析:
conn = pymssql.connect(user=user, password=password, host=host, database=db, autocommit=True)
2. 手动处理游标结果并转换为DataFrame
绕开Pandas的read_sql_query,直接通过pymssql游标获取数据后手动构建DataFrame:
import pandas as pd import pymssql conn = pymssql.connect(user=user, password=password, host=host, database=db, as_dict=True, autocommit=True) cursor = conn.cursor() cursor.execute("select * from table") # 提取列名 columns = [col[0] for col in cursor.description] # 提取行数据(将字典转为列表) rows = [list(row.values()) for row in cursor.fetchall()] cursor.close() conn.close() # 构建DataFrame result_set = pd.DataFrame(rows, columns=columns) print(result_set.head())
3. 替换为兼容性更好的SQL驱动
改用pyodbc替代pymssql,该驱动在Pandas 2.0.0中的兼容性更稳定,连接示例:
import pandas as pd import pyodbc conn_str = f"DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={host};DATABASE={db};UID={user};PWD={password}" conn = pyodbc.connect(conn_str) result_set = pd.read_sql_query("select * from table", conn) print(result_set.head())
是否属于破坏性变更
属于破坏性变更。Pandas 2.0.0对SQL游标返回数据的解析逻辑进行了调整,原本兼容pymssqlas_dict=True返回格式的逻辑被修改,且未做向前兼容处理,导致原有正常工作的代码出现异常。这类变更通常会记录在官方迁移文档中,但可能因测试覆盖场景不全,导致该问题未被提前发现。
内容的提问来源于stack exchange,提问作者Raj Kishore Patra
相关产品推荐
相关产品推荐

