1. 程式人生 > >Windows下使用Python通過ODBC/ADO訪問資料庫

Windows下使用Python通過ODBC/ADO訪問資料庫

關鍵詞:Python 資料庫 ODBC ADO Python的確是一個很好的指令碼語言,簡潔而且功能很強。可惜文件資料奇缺,最近學Python,手裡唯一 的一本《Python技術參考大全》已經過時很久了。想用Python-ASP做一個數據庫驅動的網站,可是用Python 連線資料庫的中文資料很難找到,沒辦法,只好自己摸索了,下面就是我的一些學習心得。 準備工具: <1>下載並安裝ActivePython(http://activestate.com/Products/Dow...id=ActivePython) 有Windows下的Msi安裝包,直接安裝即可,安裝程式關聯了.py,.pyw,.pyc,.pyw等檔案型別,並且已經設定好 各種Win32擴充套件工具包。我用的是2.2.3版,安裝在C:/Python22。 <2>安裝CJK編碼解碼庫(http://cjkpython.i18n.org/)。包括gb2312,gbk,gb18030,big5等encodings, 根據你的Python版本,直接下載相應的exe安裝包,與Python 2.2.3對應的版本是cjkcodecs-1.1.win32-py2.2.exe。 下載後直接執行,自動識別安裝的Python,不需要任何設定。 <3>安裝Egenix mxBase(http://www.egenix.com/files/python/...Extensions.html)。 包含用於資料處理的一些有用的工具,如DateTime可用來處理資料庫中的時間日期型欄位。 對應Python 2.2.3的當前版本是egenix-mx-base-2.0.5.win32-py2.2.exe,同樣是自動安裝。 <4>安裝ADODBAPI(http://sourceforge.net/projects/adodbapi)。這是一個完全實現了Python DB API 2.0規範 的Python-ADO介面模組,使用很方便。下載adodbapi-2.0.1.zip解壓縮後執行Setup.bat即可完成安裝。 編寫程式碼: 下面的程式碼使用了一個Access資料庫C:/Apps/Misc.mdb,設定的ODBC資料來源名稱為Misc, 包含一個數據表testdb,共4個欄位,長整型id,字元型tx,邏輯型bl,時間日期型dt <1>使用ActivePython內含的ODBC模組訪問資料庫 示例程式碼: import sys,time,locale from odbc import * try: odbcconn=odbc("DSN=Misc") # 建立連線 except: print "無法連線到資料庫!" sys.exit() locale.setlocale(locale.LC_ALL,"") # 設定預設區域(用於顯示中文星期) try: odbccur=odbcconn.cursor() # 取得遊標 odbccur.execute("select id,tx,bl,dt from testdb") # 執行SQL查詢 therow=odbccur.fetchone() # 取一行 while therow<>None: # 判斷是否為空 id=int(therow[0]) # 轉換為整數 print "id=",id, tx=therow[1] print "tx=",tx, bl=int(therow[2]) # 邏輯值轉換為整數(0=false 1=true) print "bl=",bl, dt=time.localtime(therow[3]) # 轉換為表示本地時間的元組型別 print "dt=",time.strftime("%Y年%m月%d日,%a,%H時%M分%S秒", dt) # 格式化輸出時間 therow=odbccur.fetchone() # 取下一行 finally: odbccur.close() odbcconn.close() 執行結果: id= 1 tx= 怪獸 bl= 1 dt= 2003年12月10日,星期三,09時12分32秒 id= 2 tx= 魔物 bl= 0 dt= 2002年12月11日,星期三,08時12分43秒 id= 3 tx= 石頭 bl= 1 dt= 2004年08月03日,星期二,21時34分06秒 分析: 這段程式碼的功能是獲取和顯示資料庫的全部內容。 第一步,匯入odbc模組 import odbc 或 from odbc import * 第二步,建立連線,使用 connection=odbc(connection_string) 第三步,建立遊標,並通過遊標執行SQL語句 cursor = connection.cursor() int = cursor.execute(sql, [var, ...] ) 第四步,獲取並解析結果集。 data = cursor.fetchone() # 取一行 [data, ...] = cursor.fetchmany() # 取多行 [data, ...] = cursor.fetchall() # 取全部行 然後從data元組中取出各欄位,轉換成正確的資料型別 最後,關閉遊標和連線 cursor.close() connection.close() <2>使用ADODBAPI訪問資料庫 示例程式碼: import sys,locale,adodbapi,time try: conn=adodbapi.connect(r"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/Apps/AppData/Access/Misc.mdb;") except: print "無法連線到資料庫!" sys.exit() locale.setlocale(locale.LC_ALL,"") # 設定預設區域(用於顯示中文星期) try: cur=conn.cursor() # 取得遊標 cur.execute("select id,tx,bl,dt from testdb") # 執行SQL查詢 therow=cur.fetchone() # 取一行 while therow<>None: # 判斷是否為空 id=int(therow[0]) # 轉換為整數 print "id=",id, tx=therow[1] print "tx=",tx.encode("gb2312"), bl=int(therow[2]) # 邏輯值轉換為整數(0=false 1=true) print "bl=",bl, dt=therow[3] # 由於安裝了mxBase,therow[3]被自動轉換為DateTime型別 print "dt=",time.strftime("%Y年%m月%d日,%a,%H時%M分%S秒", dt.tuple()) therow=cur.fetchone() # 取下一行 finally: cur.close() conn.close() 執行結果:同ODBC版本 分析: 基本上和ODBC版本一樣,只是取得連線的語句變為connection=adodbapi.connect(connecion_string), ADO的連線字串有多種寫法,這裡使用Microsoft Jet OLEDB Provider 4.0直接連線。 ADODBAPI是用純Python寫成的,功能比odbc模組強,適用範圍也比較廣,推薦使用。 另外,這裡取得的tx是Unicode字串,無法直接print,需要編碼為GB2312。 以上是通過ODBC和ADO訪問資料庫的大致方法,實際上對於Access資料庫,直接使用Jet引擎訪問, 也不是很複雜。 附記1:以上程式碼在Python 2.2執行通過,但移植到Python 2.3時,需要作一些修改。 <1>Python 2.3要求指定原始檔編碼,如gb2312,utf_8,gbk,gb18030,big5等。 方法為,在原始碼檔案頂行寫 #-*-coding:編碼名稱-*- 如果安裝了CJK編碼解碼庫,則可以用 #-*-coding:gb2312-*- 來指定使用GB2312編碼,否則,即使只在註釋中用了中文,也會產生警告。 <2>ODBC版本的程式只需要指定GB2312編碼就可以在Python 2.3正常執行,ADO版本需要作修改。 原因是,ODBC版本得到的時間日期資料therow[3]是一個DbiDate型別(實際上可能是float), 可以用time.localtime()轉換為Python 2.2的time型別;而ADODBAPI會自動進行型別轉換。 轉換規則是:對Python 2.2,轉換為time型別;對Python 2.3,轉換為datetime型別; 如果安裝了mxBase,則轉換為DateTime型別,各型別提供的方法可參考其文件。 據此,在Python 2.3(未安裝mxBase),程式碼中相關的部分應改為: dt=therow[3] # therow[3] 是 datetime.datetime 型資料 print "dt=",time.strftime("%Y年%m月%d日,%a,%H時%M分%S秒", dt.timetuple()) 這裡用到的datetime.timetuple()方法是把datetime物件轉換為一個九元tuple作為格式化時間函式的輸入。