Pyodbc找不到FreeTDS驱动程序

4
我在Centos 7 Linux机器上尝试通过pyodbc连接到一个SQL数据库。我了解到您需要设置DSN,您可以通过安装freetds驱动程序并执行以下操作来完成此操作:
import pyodbc
cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER=example;DATABASE=TEST;')

很遗憾,当我这样做时,出现了错误,提示找不到FreeTDS驱动程序。我已经运行了以下内容:
$ ./configure
$ make
$ make install

看起来我已经安装了它,但我仍然得到同样的错误。可以有人请发一个可运行示例的链接吗?


1
这对我很有帮助。请尝试此指令 - Nikolai Kamenskiy
2个回答

6
如果您想从源代码编译FreeTDS,它将安装到/usr/local/freetds,如我所知。您也可以在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连接,无需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 2005,请使用TDS版本7.2。

更多信息请参见此处:

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

祝你好运。

6

@FlipperPA的回答的基础上,pyodbc如何“找到”FreeTDS驱动程序并不明显。如果您遇到此错误:

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

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

pyodbc是unixODBC的包装器,它没有文档,但您需要安装unixODBC devel软件包,然后才能pip install pyodbc。pyodbc直接将连接字符串传递给unixODBC。

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

  • 共享库文件的直接路径(例如/usr/local/lib/libtdsodbc.so
  • 或者odbcinst.ini中包含指向共享库文件的Driver = ...设置的配置部分的名称
第一种方法可以保证找到共享库,也是检查环境问题的好方法,但第二种方法更受欢迎且更具可移植性。有关更多详细信息,请参见此处

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文件时才能起作用。它会搜索以下位置:
  • 在你的主目录中,文件名已更改为.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的回答重新开始。

在Alpine中,libtdsodbc.so在哪里? - SerG

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