簡體   English   中英

Pyodbc找不到FreeTDS驅動程序

[英]Pyodbc can't find FreeTDS driver

我在Centos 7 Linux機器上嘗試通過pyodbc連接到SQL數據庫。 我了解到你需要設置DSN並通過安裝freetds驅動程序並執行以下操作來實現:

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

不幸的是,當我這樣做時,我得到一個錯誤,說無法找到驅動程序FreeTDS。 我跑了:

$ ./configure
$ make
$ make install

它似乎安裝了它,但我得到了同樣的錯誤。 有人可以給我發一個工作實例的鏈接

如果您從源代碼編譯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免費:

DRIVER={FreeTDS};SERVER=server.com;PORT=1433;DATABASE=dbname;UID=dbuser;PWD=dbpassword;TDS_Version=7.3;

幾點說明:

  • 您必須更新TDS版本以匹配您運行的SQL Server版本和正在運行的Free TDS版本。 版本0.95支持TDS版本7.3。
  • TDS版本7.3將適用於MS SQL Server 2008及更高版本。
  • 使用TDS版本7.2 for MS SQL Server 2005。

請看這里了解更多:

https://msdn.microsoft.com/en-us/library/dd339982.aspx

祝好運。

為了建立@ FlipperPA的答案 ,pyodbc如何“找到”FreeTDS驅動程序並不明顯。 如果您有此錯誤:

pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'FreeTDS' : file not found (0) (SQLDriverConnect)")

可能還有其他可能的原因,包括不正確的環境。 這是我發現的:

pyodbc是unixODBC的包裝器,沒有記錄,但你需要先安裝unixODBC開發軟件包,然后再點擊pip install pyodbc pyodbc將連接字符串直接傳遞給unixODBC。

unixODBC需要加載包含ODBC數據庫驅動程序的共享庫,例如libtdsodbc.so 您可以將連接字符串中的DRIVER參數設置為以下兩種情況之一:

  • 共享庫文件的直接路徑(例如/usr/local/lib/libtdsodbc.so
  • 或者odbcinst.ini中的配置節的名稱,其中包含指向共享庫文件的Driver = ...設置

第一種方法是保證找到共享庫,以及檢查是否存在環境問題的好方法,但第二種方式是首選且更便攜。 有關詳細信息,請參見此處

此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上)來檢查是否滿足所有庫的依賴項,並且可以由動態庫加載器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)

如果你仍然卡住了,你可能想要從這個這個答案開始從頭開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM