2016-01-14 82 views
13

我是Linux新手,我想从Python中查询Microsoft SQL Server。我在Windows上使用它,这非常好,但在Linux中,这是非常痛苦的。PyODBC:即使它存在也无法打开驱动程序

几个小时后,我终于成功地在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)") 

我不undertsand的事情是,PyODBC似乎读ODBCINST.INI正确的文件路径,仍然无法正常工作。

我去了“/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0”,该文件实际存在!

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

  • 我在一个虚拟环境
  • 我需要有“读取”权限,因为它是一个根文件路径

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

谢谢!

+0

它可能是缺少的库(由libmsodbcsql-13.0.so.0.0使用的库)或LD_LIBRARY_PATH问题。你能分享下面的命令的结果吗? 'ldd/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0' – mauro

+0

相关:[用于SQL Server的ODBC驱动程序13无法在pyodbc上打开lib](https://stackoverflow.com/q/41182415/ 55075)。 – kenorb

回答

12

在遵循微软教程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的回购没有必须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

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

谢谢,我也提供他的解决方案。比我的数据库连接有问题,但这是另一回事。 ! –

4

我发现,我here问题的解答。这是为python 2.7(所以可能不适用于那些正在寻找python 3.x解决方案的人)。

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

为了更新libgcc中,使用这个命令

conda update libgcc 
+0

如果你遵循这个链接,你会得到nehalijwani的答案,完美地重新产生问题,并解释为什么更新libgcc修复它。总结一下:pyodbc.so需要libstdC++。so。该文件存在于conda中,因此它使用该版本,而不是系统版本。不幸的是,缺省情况下,libmsodbc.sql需要比conda安装更新的版本。因此,更新conda libgcc允许对conda版本的本地引用起作用。 –

1

我有同样的问题'未找到文件(0)(的SQLDriverConnect)'上MAC OS用下面的代码

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

google搜索了两天后,我无法修复该问题甚至修改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 EI Capitan的
  • 蟒蛇3.6.1 Anconda
0

有同样的问题一次.. 1.try畅达libgcc的更新(这是因为通过安装pyodbc点子和畅达寻找不同版本的文件的..)..这可能已经固定..... 链接:https://github.com/ContinuumIO/anaconda-issues/issues/1639 找nehaljwani答案。

2.also检查ODBC文件正确的版本号/etc/odbcinst.ini和/etc/odbc.ini ...名称应该匹配,并且还驾驶路径。

1

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

相关问题