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: versionCXXABI_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

libsqlplus.so:无法打开共享对象文件:即使 PATH 包含路径,也没有这样的文件或目录

即使设置 cap_net_raw 也无法在 linux 容器中打开原始套接字