我正在尝试通过pyodbc连接到SQL数据库的Centos 7 Linux机器上。我了解到你需要设置DSN并通过安装freetds驱动程序并执行以下操作来实现:
import pyodbc
cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER=example;DATABASE=TEST;')
不幸的是,当我这样做时,我得到一个错误,说无法找到驱动程序FreeTDS。我跑了:
$ ./configure
$ make
$ make install
它似乎安装了它,但我得到了同样的错误。有人可以给我发一个工作实例的链接
答案 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;
一些注意事项:
请点击此处了解更多信息:
祝你好运。答案 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
文件时才有效。它似乎在搜索它:
.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