Windows下使用Python通過ODBC/ADO訪問資料庫
阿新 • • 發佈:2019-01-01
關鍵詞: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作為格式化時間函式的輸入。