import pyodbc
cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER=example;DATABASE=TEST;')
很遗憾,当我这样做时,出现了错误,提示找不到FreeTDS驱动程序。我已经运行了以下内容:
$ ./configure
$ make
$ make install
看起来我已经安装了它,但我仍然得到同样的错误。可以有人请发一个可运行示例的链接吗?
import pyodbc
cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER=example;DATABASE=TEST;')
$ ./configure
$ make
$ make install
看起来我已经安装了它,但我仍然得到同样的错误。可以有人请发一个可运行示例的链接吗?
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;
更多信息请参见此处:
祝你好运。在@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 = ...
设置的配置部分的名称然而,只有当unixODBC能找到你的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 (ieSybase 11
) must also be unique.
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)