PyODBC:即使存在也无法打开驱动程序
Posted
技术标签:
【中文标题】PyODBC:即使存在也无法打开驱动程序【英文标题】:PyODBC : can't open the driver even if it exists 【发布时间】:2016-04-19 13:07:18 【问题描述】:我是 linux 世界的新手,我想从 Python 查询 Microsoft SQL Server。我在 Windows 上用过,非常好,但在 Linux 上就很痛苦。
几个小时后,我终于用 unixODBC 在 Linux Mint 上成功安装了 Microsoft ODBC 驱动程序。
然后,我用 python 3 环境设置了一个 anaconda。
然后我这样做:
import pyodbc as odbc
sql_PIM = odbc.connect("Driver=ODBC Driver 13 for SQL Server;Server=XXX;Database=YYY;Trusted_Connection=Yes")
它返回:
('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0' : file not found (0) (SQLDriverConnect)")
我不明白的是,PyODBC 似乎从 odbcinst.ini 读取了正确的文件路径,但仍然无法正常工作。
我去了“/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0”,文件确实存在!
那么为什么它告诉我它不存在? 以下是一些可能的线索:
我在虚拟环境中 我需要“读取”权限,因为它是根文件路径我不知道如何解决这些问题。
谢谢!
【问题讨论】:
可能是缺少库(libmsodbcsql-13.0.so.0.0 使用的库)或 LD_LIBRARY_PATH 问题。您能否分享以下命令的结果?ldd /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0
相关:ODBC Driver 13 for SQL Server can't open lib on pyodbc.
【参考方案1】:
按照SQL Server Linux ODBC Driver 的微软教程后,我在 Ubuntu 14 上也遇到了同样的问题。
文件存在,运行ldd后,显示缺少依赖项:
/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:版本GLIBCXX_3.4.20' not found (required by /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0)
/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version
CXXABI_1.3.8'未找到(要求
搜索了一段时间后我发现它是因为 Ubuntu 的 repo 在 3.4.20 版本上没有 GLIBCXX,它是在 3.4.19。
然后我向 Ubuntu 添加了一个 repo,更新它并强制它升级 libstdc++6
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libstdc++6
问题已解决,用 isql 测试:
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
之后我尝试使用 pdo_odbc (php) 进行测试,然后它给了我相同的驱动程序未找到错误。
为了解决这个问题,我必须创建一个符号链接来修复libodbcinst.so.2
:
sudo ln -s /usr/lib64/libodbcinst.so.2 /lib/x86_64-linux-gnu/libodbcinst.so.2
【讨论】:
谢谢,我也找到了他的解决方案。比我的数据库连接有问题,但那是另一回事。 !【参考方案2】:我找到了一个适合我的答案here。这适用于 python 2.7(因此可能不适用于正在寻找 python 3.x 解决方案的人)。
建议的解决方案是更新 libgcc: 4.8.5-2 --> 5.2.0-0
要更新 libgcc,请使用此命令
conda update libgcc
【讨论】:
如果您点击该链接,您将获得 nehalijwani 的答案,该答案完美地重现了问题并解释了为什么更新 libgcc 可以解决问题。总结一下:pyodbc.so 需要 libstdc++.so。该文件存在于 conda 中,因此它使用该版本,而不是系统版本。不幸的是,libmsodbc.sql 需要比默认安装 conda 更高的版本。因此,更新 conda libgcc 允许本地引用 conda 版本。【参考方案3】:我在 MAC OS 上遇到了同样的问题 'file not found (0) (SQLDriverConnect)' 使用以下代码
cnxn = pyodbc.connect('DRIVER=ODBC Driver 13 for SQL Server;SERVER=myServerIP,1433;DATABASE=myDBName;UID=sa;PWD=dbPassword')
google了两天,修改freetds.conf、odbcinst.ini和odbc.ini都无法解决问题
最后,我通过替换 DRIVER 值找到了解决方案
cnxn = pyodbc.connect('DRIVER=/usr/local/lib/libmsodbcsql.13.dylib;SERVER=myServerIP,1433;DATABASE=myDBName;UID=sa;PWD=dbPassword') p>
我的开发环境
MAC OS El Capitan 蟒蛇中的python 3.6.1【讨论】:
您好,您能对此发表评论吗?我试过这样做,我确信 .dylib 文件存在于我指定的文件夹中。但它仍然给我错误。 01000', "[01000] [unixODBC][Driver Manager]无法打开 lib '/home/environment/msodbcsql-17.1.0.1/lib/libmsodbcsql.17.dylib' : 找不到文件 (0) (SQLDriverConnect)" ,你能建议我做错什么吗? cnxn = pyodbc.connect('DRIVER=/home/environment/msodbcsql-17.1.0.1/lib/libmsodbcsql.17.dylib;SERVER=XXXXX;DATABASE=DB;UID=XXXXXX; PWD=XXXXX) 是我的代码中的内容 我试过这个,我得到了以下错误: pyodbc.Error: ('HY000', '[HY000] [IBM][System i Access ODBC Driver]Key value in connection string too long. ( 30119) (SQLDriverConnect)') 这是我的连接字符串:DRIVER=/opt/ibm/iaccess/lib/libcwbodbc.dylib;SYSTEM=xxxxx;SIGNON=3;UID=xxxxx;PWD=xxxxx; 我可以确认在我的 MacOS 机器上使用驱动程序的绝对路径。我的驱动程序是:“/usr/local/lib/libmsodbcsql.17.dylib”。【参考方案4】:曾经遇到过同样的问题.. 1.尝试conda update libgcc(这是因为通过pip和conda安装的pyodbc会寻找不同版本的文件......)..这可能已经修复...... 链接:https://github.com/ContinuumIO/anaconda-issues/issues/1639 寻找 nehaljwani 的答案。
2.在 /etc/odbcinst.ini 和 /etc/odbc.ini 中正确检查 odbc 文件的版本号 ...名称应匹配,驱动程序路径也应匹配。
【讨论】:
【参考方案5】:以下建议可能有助于解决问题:
确保驱动器配置INI文件存在odbcinst -j
(检查odbcinst.ini
)。
确保从您的 INI 文件(运行:odbcinst -j
)中配置的驱动程序的文件路径存在并且具有读取和可执行权限标志 (O_RDONLY|O_CLOEXEC
)。
如果您仍然收到 file not found 错误,尽管该文件存在,但问题可能与 libgcc
版本不匹配(根据 nehaljwani's GitHub comment)有关。解决方案是通过运行conda update libgcc
命令更新您的libgcc
。
相关:ODBC Driver 13 for SQL Server can't open lib on pyodbc while connecting on AWS E2 ubuntu instance.
对于 macOS,请参阅:Installing ODBC via HomeBrew。
【讨论】:
【参考方案6】:也许有点晚了,但我留下了这个对我有用的脚本。
我的问题和你的一样,我测试了所有选项,例如更改驱动程序位置、创建符号链接、修改 /etc/*.ini 文件等......没有任何效果。
我的问题,在 alpine 的 docker 容器中运行 python 3.6,pyodbc 包是库 libssl1.0.0
在这里你会发现my installation script for pyodbcDebian 8 (alpine) docker image使用驱动v13
DRIVER=适用于 SQL Server 的 ODBC 驱动程序 13
我为数据库连接运行的命令是:
import pyodbc
connection_string = 'DRIVER=ODBC Driver 13 for SQL Server;'
connection_string += 'SERVER=0;DATABASE=1;UID=2;PWD=3;'.format(host,dbname,user,pwd)
connection = pyodbc.connect(connection_string)
【讨论】:
【参考方案7】:我在安装 libssl1.0.0 后解决了这个问题。
首先,我以这种方式设置我的连接字符串:
cnxn = pyodbc.connect('DRIVER=/usr/local/lib/libmsodbcsql.13.dylib;
SERVER=myServerIP,1433;DATABASE=myDBName;UID=sa;PWD=dbPassword')
然后,我安装了 libssl1.0.0:
echo "deb http://security.debian.org/debian-security jessie/updates main" >> /etc/apt/sources.list
apt-get install libssl1.0.0
最后,我设置了语言环境:
apt-get -y install locales
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
完成这些步骤后,我的 python 模块能够找到并连接到数据库。
【讨论】:
以上是关于PyODBC:即使存在也无法打开驱动程序的主要内容,如果未能解决你的问题,请参考以下文章
无法打开 geoip.dat 文件。即使文件存在,“无法打开流”
即使链接似乎正确,也无法通过 AVPlayer 打开远程音频文件
即使通过开发人员命令提示符打开 VSCode 也无法识别 CL