2015-10-15 77 views
0

我正在试图通过pyodbc连接到SQL数据库的Centos 7 Linux机器上。我了解到,你需要设置DSN和你做,通过安装驱动程序freetds的和做的是这样的:Pyodbc无法找到FreeTDS驱动程序

import pyodbc 
cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER=example;DATABASE=TEST;') 

不幸的是,当我这样做,我得到一个错误说司机freetds的无法找到。我跑了:

$ ./configure 
$ make 
$ make install 

它似乎已经安装它,但我得到相同的错误。有人可以给我一个链接到一个工作示例

回答

1

如果您从源代码编译FreeTDS,它会安装到/ usr/local/freetds,IIRC。您也可以通过CentOS上的yum进行安装,并且您还需要unixODBC。基本上,FreeTDS将SQL Server连接到unixODBC,pyodbc将unixODBC连接到Python。

下面是设置了freetds的,unixODBC的,朋友们一个例子:

freetds.conf:

[server] 
     host = server.com 
     port = 1433 
     tds version = 7.3 

ODBC.INI:

[server] 
Driver = FreeTDS 
Server = server.com 
Port = 1433 
TDS_Version = 7.3 

ODBCINST.INI:

[FreeTDS] 
Description = FreeTDS with Protocol up to 7.3 
Driver = /usr/lib64/libtdsodbc.so.0 

The Driver =位置可能与以上不同,具体取决于您的FreeTDS发行版 - 如果您是从源代码编译的,最有可能的是/usr/local/freetds/lib/libtdsodbc.so

pyodbc连接,DSN免费:

DRIVER={FreeTDS};SERVER=server.com;PORT=1433;DATABASE=dbname;UID=dbuser;PWD=dbpassword;TDS_Version=7.3; 

的几个注意事项:

  • 你必须更新TDS版本,以便与正在运行的SQL Server的版本和免费TDS你正在运行的版本。版本0.95支持TDS版本7.3。
  • TDS版本7.3将与MS SQL Server 2008及更高版本一起使用。 MS SQL Server的
  • 使用TDS 7.2版2005年

在这里看到更多:

https://msdn.microsoft.com/en-us/library/dd339982.aspx

好运。

1

要建立在@FlipperPA's answer上,pyodbc如何“发现”FreeTDS驱动程序并不明显。如果你有这个错误:

pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'FreeTDS' : file not found (0) (SQLDriverConnect)") 

可能还有其他可能的原因,包括不正确的环境。这是我发现:

pyodbc是unixODBC的周围,这是没有记录的包装,但在此之前,你可以pip install pyodbc你需要install the unixODBC devel packages。 pyodbc将连接字符串直接传递给unixODBC。

unixODBC需要加载包含ODBC数据库驱动程序的共享库,例如用于FreeTDS的libtdsodbc.so。您可以在连接字符串中DRIVER参数设置为以下两种情况之一:

  • 无论是直接的路径的共享库文件(例如,/usr/local/lib/libtdsodbc.so
  • 还是一个配置部分的odbcinst.ini名,其中包含一个Driver = ...设置指向共享库文件

第一种方法是保证找到共享库,以及一个很好的方式来检查你是否有环境问题,但第二个方法是首选,更便于携带。详情请参阅here

This ini file simply lists all installed drivers. It is located in /etc/odbcinst.ini. The syntax is simple; a name followed by a property which tells us the drivers file name. For example;

[Sybase 11] 
Comment = Super Duper Sybase Server 
Driver = /usr/lib/libsybase.so.11 
Setup = /usr/lib/libsybaseS.so.11 
FileUsage = 1 

The Driver file name (ie /usr/lib/libsybase.so.11) should be unique. The friendly name (ie Sybase 11) must also be unique.

然而,这只能工作,如果unixODBC的可以找到你的odbcinst.ini文件。这似乎寻找它:

  • in your home directory用修改后的名称,.odbcinst.ini
  • 在目录由ODBCSYSINI环境变量指向的,如果设置。
  • 否则,在/etc

对于freetds的它应该包含这样的事情:

[FreeTDS] 
Description = For example, my database server name or FreeTDS version 
Driver = /usr/local/lib/libtdsodbc.so 

,然后才可以在连接字符串中使用DRIVER=FreeTDS,并期望它的工作(而不是出现上述错误)。

您可能还需要使用ldd命令(在Linux上)检查所有图书馆的依赖关系得到满足,并且可以被发现和利用动态库加载器加载,ld.so

ldd /usr/local/lib/libtdsodbc.so 
ldd: warning: you do not have execution permission for `/usr/local/lib/libtdsodbc.so' 
     linux-vdso.so.1 => (0x00007ffe145fe000) 
     libodbcinst.so.2 => /lib64/libodbcinst.so.2 (0x00007f81f9dfd000) 
     libdl.so.2 => /lib64/libdl.so.2 (0x00007f81f9bf8000) 
     libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f81f99dc000) 
     libc.so.6 => /lib64/libc.so.6 (0x00007f81f961b000) 
     libltdl.so.7 => /usr/local/lib/libltdl.so.7 (0x00007f81f940f000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007f81fa2ac000) 

如果你仍然卡住,你可能想从头开始按照thisthis的答案。

相关问题