Linux下pandas.read_sql查询MS SQL时查询串超274字符卡住问题求助
解决思路
- 升级/替换ODBC驱动版本
ODBC Driver 17 for SQL Server的部分小版本存在Linux环境下长查询字符串处理的已知bug,你可以尝试升级到ODBC Driver 18 for SQL Server,或回退到17.3及以下的稳定版本,Ubuntu环境下可直接通过微软官方源安装对应版本。 - 升级unixODBC组件
Ubuntu默认源携带的unixODBC版本通常较低,存在和高版本SQL Server ODBC驱动兼容的问题,执行以下命令升级到最新版:sudo apt update && sudo apt install unixodbc unixodbc-dev -y
升级后可以通过odbcinst -j验证配置路径是否正确。 - 修改ODBC驱动全局配置
编辑/etc/odbcinst.ini文件,找到[ODBC Driver 17 for SQL Server]配置块,追加以下参数:
TDS_Version = 7.4 BufferSize = 65535 AnsiNPW = Yes
配置完成后需要重启Python进程生效。
- 调整pandas调用方式
不要直接将连接字符串传给pandas.read_sql(),优先通过pyodbc创建显式连接对象,同时开启自动提交参数,示例代码如下:
import pandas as pd import pyodbc # 连接时开启autocommit conn = pyodbc.connect('<你的连接串>', autocommit=True) # 先清理查询字符串首尾的空白字符 query = 'SELECT TOP 10 * FROM 你的schema.你的表.你的字段'.strip() df = pd.read_sql(query, conn) conn.close()
如果仍有问题,可以改用SQLAlchemy封装连接:
import pandas as pd from sqlalchemy import create_engine import urllib quoted_con_str = urllib.parse.quote_plus('<你的连接串>') engine = create_engine(f'mssql+pyodbc:///?odbc_connect={quoted_con_str}') query = 'SELECT TOP 10 * FROM 你的schema.你的表.你的字段'.strip() df = pd.read_sql(query, engine) engine.dispose()
- 清理查询字符串格式
如果你的查询字符串包含大量换行、冗余空格,先做格式化处理,移除不必要的空白字符,避免触发驱动的缓冲区溢出类bug。
内容的提问来源于stack exchange,提问作者Artin Zamani
相关产品推荐
相关产品推荐

