PyODBC:即使驱动程序存在也无法打开

PyODBC : can't open the driver even if it exists

我是 linux 世界的新手,我想从 Python 查询 Microsoft SQL 服务器。我在 Windows 上使用它,它非常好,但在 Linux 上它非常痛苦。

几个小时后,我终于成功在 Linux Mint with unixODBC 上安装了 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")

它returns :

('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”,文件确实存在!

那为什么它告诉我它不存在呢? 这里有一些可能的线索:

我不知道如何解决这两个问题。

谢谢!

在遵循 SQL Server Linux ODBC Driver 的 Microsoft 教程后,我在 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) 进行测试,然后它给了我相同的驱动程序未找到错误。 为了解决这个问题,我必须创建一个符号 link 来修复 libodbcinst.so.2:

sudo ln -s /usr/lib64/libodbcinst.so.2 /lib/x86_64-linux-gnu/libodbcinst.so.2

我找到了适合我的答案here。这是针对 python 2.7 的(因此可能不适用于那些正在寻找 python 3.x 解决方案的人)。

建议的解决方案是更新 libgcc:4.8.5-2 --> 5.2.0-0

要更新 libgcc,请使用此命令

conda update libgcc

我在 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')

我的开发环境

  • MACOS埃尔卡皮坦
  • python 蟒蛇中的 3.6.1

曾经有过同样的问题.. 1.try conda update libgcc(这是因为通过 pip 安装的 pyodbc 和 conda 寻找不同版本的文件......)。这可能已经修复了...... link:https://github.com/ContinuumIO/anaconda-issues/issues/1639 寻找 nehaljwani 的答案。

2.also 在 /etc/odbcinst.ini 和 /etc/odbc.ini 中正确检查 odbc 文件的版本号 ...名称应该匹配,驱动程序路径也应该匹配。

以下建议可能有助于解决问题:

  • 确保驱动器配置 INI 文件存在 odbcinst -j(检查 odbcinst.ini)。
  • 确保从您的 INI 文件 (运行: odbcinst -j) 配置的驱动程序的文件路径存在并且具有读取和可执行权限标志 (O_RDONLY|O_CLOEXEC)。
  • 如果您仍然遇到 找不到文件 错误,尽管文件存在,但问题可能与 libgcc 版本不匹配有关 nehaljwani's GitHub comment。解决方案是通过 运行ning conda update libgcc 命令更新您的 libgcc

    相关:.

  • 对于 macOS,请参阅:Installing ODBC via HomeBrew

也许有点晚了,但我保留了这个对我有用的脚本。

我的问题和你的一样,我测试了所有选项,例如更改驱动程序位置、制作符号 link、修改 /etc/*.ini 文件等...都没有用。

我的问题,运行ning python 3.6,来自 alpine 的 docker 容器中的 pyodbc 包是库 libssl1.0.0

在这里你会发现 my installation script for pyodbc Debian 8 (alpine) docker image 使用驱动程序 v13

DRIVER={ODBC Driver 13 for SQL Server}

我 运行 用于数据库连接的命令是:

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)

我安装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 模块能够找到并连接到数据库。