使用pyodbc通过DSN连接SQL Server时遇SQLAllocHandle错误求助
问题:pyodbc连接SQL Server时出现IM004错误
代码片段
import pyodbc pyodbc.autocommit = True conn = pyodbc.connect('DSN=SQLSERVER_CONN') cursor = conn.cursor() cursor.execute('select count(1) from jupiter.fact_load') result = cursor.fetchall() for row in result: print(row) cursor.close() conn.close()
.odbc.ini配置
[SQLSERVER_CONN] Description=Connection to SQLSERVER UAT DRIVER=/home/aiman/mssql-jdbc/9.2.0/libmsodbcsql-11.0.so.2270.0 SERVER=my.sqlserver.com,10501 DATABASE=jupiter UID=aiman PWD=xxxxx Trusted_Connection=yes
错误信息
Traceback (most recent call last): File "test_odbc.py", line 5, in <module> conn = pyodbc.connect('DSN=SQLSERVER_CONN') pyodbc.Error: ('IM004', "[IM004] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect)")
解决办法
- 调整rll文件目录结构:SQL Server ODBC驱动要求
.rll文件放在驱动目录的对应locale子目录下。比如在/home/aiman/mssql-jdbc/9.2.0/下创建en-US文件夹,将msodbcsqlr11.rll移入该文件夹。unixODBC默认会在驱动目录的locale子目录加载资源文件,直接放在根目录无法识别。 - 指定ODBC配置文件路径:运行脚本前设置环境变量,确保个人账号能正确读取
.odbc.ini:
如果export ODBCSYSINI=$HOME.odbc.ini不在home目录,替换为实际路径。 - 移除冲突的认证配置:配置中同时存在
UID/PWD和Trusted_Connection=yes,二者冲突。Linux环境下无Windows域支持,优先删除Trusted_Connection=yes这一行,使用账号密码认证。 - 检查文件权限:确认驱动文件和
.rll文件对个人账号有可读权限:
若权限不足,执行ls -l /home/aiman/mssql-jdbc/9.2.0/chmod +r /home/aiman/mssql-jdbc/9.2.0/libmsodbcsql-11.0.so.2270.0 /home/aiman/mssql-jdbc/9.2.0/en-US/msodbcsqlr11.rll添加读权限。 - 用isql测试连接:通过unixODBC自带的
isql工具直接测试DSN连接,排除pyodbc层面的问题:isql SQLSERVER_CONN
内容的提问来源于stack exchange,提问作者aiman
相关产品推荐
相关产品推荐

