以@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 文件时才有效。它似乎在搜索它:
对于 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 的回答从头开始。