CentOS下通過freeTDS連線Sybase資料庫,以及利用Python完成查詢
序
某生成環境需要定期連線Sybase資料庫提取資料,伺服器實體機的作業系統為windows server 2016,嘗試了官方的 odbc驅動 ,能連上資料庫,但它是收費軟體試用期30天,過期就不能用了。
也嘗試過windows下其他第三方客戶端(TOAD等),可能由於對方資料庫的版本等關係,都不太成功,最終轉向使用linux下的freeTDS和unixODBC進行資料庫對接。
FreeTDS
FreeTDS官網: http://www.freetds.org/ ,官網首頁上關於FreeTDS的簡介(翻譯):
FreeTDS是一套允許你的程式自然地與微軟SQL Server和Sybase互動的Unix和Linux庫。
它是官方資料庫客戶端所採用的協議的開源實現,因此可以免費使用。
環境
- VMware Player 12.5(CPU較舊,不支援SLA,只能安裝較老版本的VMware)
- CentOS 7 x64
- Python 3.7
安裝和配置
-
安裝必要的庫
yum安裝wget、gcc和unixODBC驅動
yum install wget gcc -y yum install unixODBC unixODBC-devel -y
下載freeTDS原始碼,配置、編譯安裝,注意更改實際下載的版本號。
cd /tmp wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz tar xzvf freetds-patched.tar.gz cd freetds-1.00.111 ./configure --prefix=/usr/local --sysconfdir=/etc make make install
-
配置
主要包括3個配置檔案,其中兩個ODBC相關的配置位於/etc下,可以通過 odbjinst -j 確認。
一個freeTDS的配置,在安裝過程中已指定放在/etc下。
因此3個檔案均位於/etc下。
以資料庫標籤DBSVR2,IP地址10.11.12.13,埠4100,資料庫名稱pmdb為例:
- 配置odbc資料庫:
cat <<EOF >> /etc/odbc.ini [DBSVR2] Driver = FreeTDS Description = AS YOU LIKE Server = 10.11.12.13 Port = 4100 Database = pmdb TDS_Version = 5.0
- 配置odbc驅動路徑:
cat <<EOF >> /etc/odbcinst.ini [FreeTDS] Description= FreeTDS unixODBC Driver Driver= /usr/local/lib/libtdsodbc.so Setup= /usr/local/lib/libtdsodbc.so EOF
- 配置freetds資料庫:
cat <<EOF >> /etc/freetds.conf [DBSVR2] host = 10.11.12.13 port = 4100 tds version = 5.0 EOF
幾點說明:
-
odbcinst.ini中只需對驅動配置一次,名稱(該例中為FreeTDS)需要與odbc.ini中每個資料庫的Driver欄位匹配。
-
如果需訪問多個數據庫,freetds.conf 和 odbc.ini 需對每個需要訪問的資料庫單獨配置一塊內容,freetds.conf 中的資料庫標籤(方括號中內容)需與 odbc.ini 中的資料庫標籤(方括號中內容)相匹配。
-
TDS VERSION這個引數,控制不同的協議版本,對應不同的資料庫, 官方說明 如下:
TDS 4.2 Sybase and Microsoft
The version in use at the time of the Sybase/Microsoft split.
TDS 5.0 Sybase
Introduced for Sybase. Because TDS 5.0 includes negotiated capabilities through which protocol features can be expanded, we are unlikely to see a new TDS version from Sybase.
TDS 7.0 Microsoft
Introduced for SQL Server 7.0. Includes support for the extended datatypes in SQL Server 7.0 (such as char/varchar fields of more than 255 characters). It also includes support for Unicode.
……
所以這裡配置5.0,實際測試這個協議版本正常,其餘協議版本確實無法連線。
連線測試
- 利用tsql命令可對資料庫連線進行測試。
tsql -S DBSVR2 -p 4100 -U username -P password

tsql測試
讀到對端的字符集,出現提示符,表示測試成功。
-
互動式SQL命令列
使用isql命令可連線資料庫進行互動式SQL操作。
isql DBSVR2 username password

isql互動式命令列
出現Connected表示連線成功,在提示符後可以執行SQL指令。
利用Python連線資料庫並完成查詢
需安裝pyodbc庫,以查詢輸出到pandas DataFrame為例,程式碼如下(非常簡單,注意DSN寫法):
import pyodbc dsn = "DSN=DBSVR2;UID=username;PWD=password" sy_conn = pyodbc.connect(dsn) sql = "select ..." # 一個查詢SQL _df = pd.read_sql(sql, sy_conn) sy_conn.close()
總結
由於官方驅動和客戶端等都為收費軟體,故採用linux下的odbc驅動連線Sybase資料庫。驅動安裝和配置完成後,可以正常使用的情況下,就可以利用Python等程式語言隨心所欲地進行資料庫操作了。