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

时间:2016-01-14 09:18:36

标签: python sql-server linux pyodbc unixodbc

我是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"并且文件确实存在!

那为什么它告诉我它不存在? 以下是一些可能的线索:

  • 我在虚拟环境中
  • 我需要"阅读"权利,因为它是根文件路径

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

谢谢!

7 个答案:

答案 0 :(得分:14)

在关注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: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: 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

答案 1 :(得分:4)

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

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

要更新libgcc,请使用此命令

conda update libgcc

答案 2 :(得分:2)

我在MAC OS上遇到同样的问题'文件未找到(0)(SQLDriverConnect)',代码如下

  

cnxn = pyodbc.connect(' DRIVER = {用于SQL Server的ODBC驱动程序13} ; SERVER = myServerIP,1433; DATABASE = myDBName; UID = sa; PWD = dbPassword')

谷歌搜索了两天之后,即使修改了freetds.conf,odbcinst.ini和odbc.ini,也无法解决问题

最后,我通过替换 DRIVER

找到了解决方案
  

cnxn =   pyodbc.connect( '的 DRIVER = {的/ usr /本地/ LIB / libmsodbcsql.13.dylib} ; SERVER = myServerIP,1433; DATABASE = myDBName; UID = SA; PWD = DBPASSWORD')

我的开发环境

  • MAC OS El Capitan
  • python 3.6.1 in Anaconda

答案 3 :(得分:1)

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

答案 4 :(得分:1)

也许有点晚了,但我留下了适合我的脚本。

我的问题与你的问题相同,我测试了所有选项,例如更改驱动程序位置,创建符号链接,修改/etc/*.ini文件等等......没有任何效果。

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

您可以在此处使用驱动程序v13

找到my installation script for pyodbc Debian 8 (alpine) docker image
  

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)

答案 5 :(得分: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

最后,我设置了语言环境:

    apt-get -y install locales 
    echo "en_US.UTF-8 UTF-8" > /etc/locale.gen 

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

答案 6 :(得分:0)

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

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