Ubuntu下Python连接远程Windows MSSQL及写入DataFrame问题
Python连接MSSQL:修复pyodbc错误及替代库方案
修复你的pyodbc IM002错误
错误根源是连接字符串的冲突配置:你同时指定了SQL身份验证的UID/PWD和Windows身份验证的Trusted_Connection=yes,Ubuntu环境下无法同时兼容这两种验证方式。另外,Linux下ODBC驱动名称建议用花括号包裹,确保驱动管理器能正确识别。
修正后的连接代码:
import pyodbc # 删除Trusted_Connection参数,或设置为no conn_str = 'DRIVER={ODBC Driver 18 for SQL Server};SERVER=192.168.101.56;DATABASE=DEMAND_FORECAST;ENCRYPT=yes;UID=della;PWD=strong;' conn = pyodbc.connect(conn_str)
若问题仍存在,可检查/etc/odbcinst.ini文件,确认驱动条目是否正确(需与pyodbc.drivers()返回的名称完全一致):
[ODBC Driver 18 for SQL Server] Description=Microsoft ODBC Driver 18 for SQL Server Driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.3.so.2.1 UsageCount=1
替代pyodbc的连接库
1. SQLAlchemy(适配pandas首选)
SQLAlchemy是ORM框架,与pandas的to_sql方法完美兼容,代码更简洁,适合批量数据写入。
安装依赖:
pip install sqlalchemy pyodbc pandas
连接并写入DataFrame示例:
from sqlalchemy import create_engine import pandas as pd # 构造SQLAlchemy连接字符串 engine_str = "mssql+pyodbc://della:strong@192.168.101.56/DEMAND_FORECAST?driver=ODBC+Driver+18+for+SQL+Server&encrypt=yes" engine = create_engine(engine_str) # 示例DataFrame test_df = pd.DataFrame({'id': [1,2,3], 'value': ['x','y','z']}) # 写入数据库表(if_exists可选replace/append/fail) test_df.to_sql('target_table', con=engine, if_exists='replace', index=False)
2. pymssql
pymssql基于FreeTDS实现,无需依赖ODBC驱动,适合不想配置ODBC环境的场景。
安装:
pip install pymssql pandas
连接及写入示例:
import pymssql import pandas as pd # 建立连接 conn = pymssql.connect( server='192.168.101.56', user='della', password='strong', database='DEMAND_FORECAST' ) # 写入DataFrame test_df = pd.DataFrame({'id': [1,2,3], 'value': ['x','y','z']}) test_df.to_sql('target_table', conn, if_exists='replace', index=False) conn.close()
注意点
- pymssql对MSSQL最新版本的兼容性略逊于pyodbc,比如TLS 1.3支持有限
- 使用SQLAlchemy时,连接字符串中的驱动名称必须与
pyodbc.drivers()返回的完全匹配
内容的提问来源于stack exchange,提问作者Della
相关产品推荐
相关产品推荐

