Pyodbc无法找到FreeTDS驱动程序

时间:2015-10-15 21:03:22

标签: python sql-server pyodbc centos7 freetds

我正在尝试通过pyodbc连接到SQL数据库的Centos 7 Linux机器上。我了解到你需要设置DSN并通过安装freetds驱动程序并执行以下操作来实现:

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

不幸的是,当我这样做时,我得到一个错误,说无法找到驱动程序FreeTDS。我跑了:

$ ./configure
$ make
$ make install

它似乎安装了它,但我得到了同样的错误。有人可以给我发一个工作实例的链接

2 个答案:

答案 0 :(得分:2)

如果您从源代码编译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

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

pyodbc connect,DSN free:

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及更高版本。
  • 将TDS版本7.2用于MS SQL Server 2005。

请点击此处了解更多信息:

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

祝你好运。

答案 1 :(得分: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的包装器,没有记录,但是你需要install the unixODBC devel packages才能pip install pyodbc。 pyodbc将连接字符串直接传递给unixODBC。

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

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

第一种方法是保证找到共享库,并且检查是否存在环境问题是一种好方法,但第二种方式是首选且更便携。有关详细信息,请参阅here

  

此ini文件只列出所有已安装的驱动程序。它位于   /etc/odbcinst.ini。语法很简单;名称后跟属性   它告诉我们驱动程序文件名。例如;

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

驱动程序文件名(即/usr/lib/libsybase.so.11)应该是唯一的。   友好名称(即Sybase 11)也必须是唯一的。

但是,这只有在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上)检查所有库的依赖项是否满足,并且可以由动态库加载器{{1}找到并加载}}:

ld.so

如果您仍然遇到困难,可能需要按照thisthis回答从头开始。