[英]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;
幾點說明:
請看這里了解更多:
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.