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

27
我是一个新手,希望能在Linux中使用Python查询Microsoft SQL Server。在Windows上,这很容易实现,但在Linux上却相当麻烦。经过几个小时的努力,我终于成功在Linux Mint上安装了Microsoft ODBC驱动程序,并与unixODBC配合使用。然后,我搭建了一个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",并且该文件确实存在!
那么为什么它告诉我该文件不存在呢?以下是一些可能的线索:
  • 我在虚拟环境中
  • 因为这是根路径,所以我需要具有“读取”权限
我不知道如何解决这两个问题。
谢谢!

1
可能是缺少库文件(由libmsodbcsql-13.0.so.0.0使用的库文件)或者是LD_LIBRARY_PATH问题。请问您能否分享以下命令的结果?ldd /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0 - mauro
{btsdaf} - kenorb
8个回答

15

在按照微软的 SQL Server Linux ODBC 驱动程序 教程后,我在 Ubuntu 14 上遇到了同样的问题。

这个文件是存在的,但在运行 ldd 后,它显示有一些缺失的依赖:

/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version 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' not found (required by

经过一段时间的搜索,我发现这是因为 Ubuntu 的仓库没有 GLIBCXX 3.4.20 版本,而只有 3.4.19 版本。

然后我添加了一个仓库到 Ubuntu 中,更新了它并强制升级了 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


为了解决这个问题,我需要创建一个符号链接以修复libodbcinst.so.2
sudo ln -s /usr/lib64/libodbcinst.so.2 /lib/x86_64-linux-gnu/libodbcinst.so.2

谢谢,我也找到了他的解决方案。但是我现在遇到了连接数据库的问题,不过那是另外一个故事了。 - Joseph Yourine

8

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

经过两天的搜索和修改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')

我的开发环境:

  • MAC OS El Capitan
  • Python 3.6.1(Anaconda版本)

你好,请问您能否对此进行评论?我尝试了这个,我确定指定的文件夹中存在 .dylib 文件。但它仍然给我错误信息 "01000',"[01000] [unixODBC][Driver Manager]Can't open lib '/home/environment/msodbcsql-17.1.0.1/lib/libmsodbcsql.17.dylib' : file not found (0) (SQLDriverConnect)",您能否建议我可能做错了什么? - Kikanye
cnxn = pyodbc.connect('DRIVER={/home/environment/msodbcsql-17.1.0.1/lib/libmsodbcsql.17.dylib};SERVER=XXXXX;DATABASE=DB;UID=XXXXXX;PWD=XXXXX') 是我代码中的内容。 - Kikanye
我尝试了这个,但是出现了以下错误:pyodbc.Error: ('HY000', '[HY000] [IBM][System i Access ODBC Driver]连接字符串中的键值太长。(30119) (SQLDriverConnect)')这是我的连接字符串:DRIVER={/opt/ibm/iaccess/lib/libcwbodbc.dylib};SYSTEM=xxxxx;SIGNON=3;UID=xxxxx;PWD=xxxxx; - pmalbu
我可以确认,在我的MacOS机器上使用绝对路径到驱动程序是有效的。我的驱动程序是:“/usr/local/lib/libmsodbcsql.17.dylib”。 - Nguyen

4
我发现了一个对我有用的答案,在这里。这是针对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中存在,所以它使用的是conda版本,而不是系统版本。不幸的是,libmsodbc.sql需要比conda默认安装的版本更高的版本。因此,更新conda的libgcc允许本地引用conda版本的工作。 - Nadir Sidi

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

1

也许有点晚了,但我留下了这些脚本,对我很有效。

我的问题与你的相同,我尝试了所有选项,例如更改驱动程序位置、创建符号链接、修改/etc/*.ini文件等,但都没有起作用。

我的问题是,在alpine的docker容器中运行python 3.6和pyodbc包时,需要库libssl1.0.0

在这里,您将找到我的pyodbc安装脚本 Debian 8 (alpine) docker镜像,使用驱动程序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)

1
我安装了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

最终,我设置了本地化(locales):
    apt-get -y install locales 
    echo "en_US.UTF-8 UTF-8" > /etc/locale.gen 

在完成这些步骤后,我的Python模块能够找到并连接到数据库。


0

曾经遇到过同样的问题.. 1.尝试conda update libgcc(这是因为通过pip安装的pyodbc和conda寻找不同版本的文件..)..这个问题可能已经被解决了..... 链接:https://github.com/ContinuumIO/anaconda-issues/issues/1639 查看nehaljwani的回答。

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


-1

我在一台搭载 macOS Mavericks 的 Mac mini M1 上遇到了同样的问题。安装了支持 ARM 架构的Microsoft 18号驱动程序后,仍然无法解决问题。

brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
HOMEBREW_NO_ENV_FILTERING=1 ACCEPT_EULA=Y brew install msodbcsql18 mssql-tools18

然而,命令行上的isql能够连接到数据库。

isql -v -k "DRIVER={ODBC Driver 18 for SQL Server};SERVER=<MYSERVERNAME>;PORT=<MYPORT>;DATABASE=<MYDATABASE>;UID=<USERNAME>;PWD=<PASSWORD>"

最终解决方法是卸载pyodbc并重新安装。

python -m pip uninstall pyodbc
python -m pip install pyodbc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接