要建立在@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
文件。这似乎寻找它:
对于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)
如果你仍然卡住,你可能想从头开始按照this或this的答案。