【问题标题】:Pyodbc can't find FreeTDS driverPyodbc 找不到 FreeTDS 驱动程序
【发布时间】:2015-10-15 21:03:21
【问题描述】:

我在 Centos 7 Linux 机器上尝试通过 pyodbc 连接到 SQL 数据库。我了解到您需要设置 DSN,您可以通过安装 freetds 驱动程序并执行以下操作来做到这一点:

import pyodbc
cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER=example;DATABASE=TEST;')

不幸的是,当我这样做时,我收到一条错误消息,提示找不到驱动程序 FreeTDS。我跑了:

$ ./configure
$ make
$ make install

它似乎已经安装了它,但我得到了同样的错误。有人可以给我一个工作示例的链接

【问题讨论】:

标签: python sql-server pyodbc centos7 freetds


【解决方案1】:

如果您从源代码编译 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 连接,无 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

祝你好运。

【讨论】:

    【解决方案2】:

    @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 文件时才有效。它似乎在搜索它:

    • in your home directory 修改后的名称,.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 在哪里?
    猜你喜欢
    • 2017-01-17
    • 2022-06-15
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2016-08-05
    相关资源
    最近更新 更多