Python實現資料庫編程方法詳解
本文執行個體講述了Python實現資料庫編程方法。分享給大家供大家參考。具體分析如下:
用PYTHON語言進行資料庫編程, 至少有六種方法可供採用. 我在實際項目中採用,不但功能強大,而且方便快捷.以下是我在工作和學習中經驗總結.
方法一:使用DAO (Data Access Objects)
這個第一種方法可能會比較過時啦.不過還是非常有用的. 假設你已經安裝好了PYTHONWIN,現在開始跟我上路吧……
找到工具列上ToolsàCOM MakePy utilities,你會看到彈出一個Select Library的對話方塊, 在列表中選擇'Microsoft DAO 3.6 Object Library'(或者是你所有的版本).
現在實現對資料的訪問:
?
|
1
2
3
4
5 |
#執行個體化資料庫引擎
import win32com.client
engine = win32com.client.Dispatch("DAO.DBEngine.35")
#執行個體化資料庫物件,建立對資料庫的串連
db = engine.OpenDatabase(r"c:/temp/mydb.mdb")
|
現在你有了資料庫引擎的串連,也有了資料庫物件的執行個體.現在就可以開啟一個recordset了. 假設在資料庫中已經有一個表叫做 'customers'. 為了開啟這個表,對其中資料進行處理,我們使用下面的文法:
?
|
1
2
3 |
rs = db.OpenRecordset("customers")
#可以採用SQL語言對資料集進行操縱
rs = db.OpenRecordset("select * from customers where state = 'OH'")
|
你也可以採用DAO的execute方法. 比如這樣:
?
|
1
2 |
db.Execute("delete * from customers where balancetype = 'overdue' and name = 'bill'")
#注意,刪除的資料不能複原了J
|
EOF 等屬性也是可以訪問的, 因此你能寫這樣的語句:
?
|
1
2
3 |
while not rs.EOF:
print rs.Fields("State").Value
rs.MoveNext()
|
我最開始採用這個方法,感覺不錯.
方法二:使用Python DB API,Python ODBC modules(you can use ODBC API directly, but maybe it is difficult for most beginner.)
為了在Python裡面也能有通用的資料庫介面,DB-SIG為我們提供了Python資料庫.(欲知詳情,訪問DB-SIG的網站,http://www.python.org/sigs/db-sig/). Mark
Hammond的win32擴充PythonWin裡麵包含了這些API的一個應用-odbc.pyd. 這個資料庫API僅僅開放了一些有限的ODBC函數的功能(那不是它的目的),但是它使用起來很簡單,而且在win32裡面是免費的.
安裝odbc.pyd的步驟如下:
1. 安裝python軟體包:
http://www.python.org/download/
2. 安裝Mark Hammond的最新版本的python win32擴充 - PythonWin:
http://starship.python.net/crew/mhammond/
3. 安裝必要的ODBC驅動程式,用ODBC管理器為你的資料庫配置資料來源等參數
你的應用程式將需要事先匯入兩個模組:
dbi.dll - 支援各種各樣的SQL資料類型,例如:日期-dates
odbc.pyd – 編譯產生的ODBC介面
下面有一個例子:
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
import dbi, odbc # 匯入ODBC模組
import time # 標準時間模組
dbc = odbc.odbc( # 開啟一個資料庫連接
'sample/monty/spam' # '資料來源/使用者名稱/密碼'
)
crsr = dbc.cursor() # 產生一個cursor
crsr.execute( # 執行SQL語言
"""
SELECT country_id, name, insert_change_date
FROM country
ORDER BY name
"""
)
print 'Column descriptions:' # 顯示行描述
for col in crsr.description:
print ' ', col
result = crsr.fetchall() # 一次取出所有的結果
print '/nFirst result row:/n ', result[0] # 顯示結果的第一行
print '/nDate conversions:' # 看看dbiDate對象如何?
date = result[0][-1]
fmt = ' %-25s%-20s'
print fmt % ('standard string:', str(date))
print fmt % ('seconds since epoch:', float(date))
timeTuple = time.localtime(date)
print fmt % ('time tuple:', timeTuple)
print fmt % ('user defined:', time.strftime('%d %B %Y', timeTuple))
|
下面是結果:
輸出(output)
?
|
1
2
3
4
5
6
7
8
9
10
11 |
Column descriptions:
('country_id', 'NUMBER', 12, 10, 10, 0, 0)
('name', 'STRING', 45, 45, 0, 0, 0)
('insert_change_date', 'DATE', 19, 19, 0, 0, 1)
First result row:
(24L, 'ARGENTINA', <DbiDate object at 7f1c80>)
Date conversions:
standard string: Fri Dec 19 01:51:53 1997
seconds since epoch: 882517913.0
time tuple: (1997, 12, 19, 1, 51, 53, 4, 353, 0)
user defined: 19 December 1997
|
大家也可以去http://www.python.org/windows/win32/odbc.html看看,那兒有兩個Hirendra Hindocha寫的例子,還不錯.
注意, 這個例子中,結果值被轉化為Python對象了.時間被轉化為一個dbiDate對象.這裡會有一點限制,因為dbiDate只能表示UNIX時間(1 Jan 1970 00:00:00 GMT)之後的時間.如果你想獲得一個更早的時間,可能會出現亂碼甚至引起系統崩潰.*_*
方法三: 使用 calldll模組
(Using this module, you can use ODBC API directly. But now the python version is 2.1, and I don't know if other version is compatible with it. 老巫:-)
Sam Rushing的calldll模組可以讓Python調用任何動態串連庫裡面的任何函數,厲害吧?哈.其實,你能夠通過直接調用odbc32.dll裡面的函數操作ODBC.Sam提供了一個封裝模組odbc.py,就是來做這個事情的.也有代碼來管理資料來源,安裝ODBC,實現和維護資料庫引擎 (Microsoft Access).在那些示範和例子代碼中,還有一些讓人側目的好東東,比如cbdemo.py,有一個資訊迴圈和視窗過程的Python函數!
[你可以到Sam's Python Software去找到calldll的相關串連,那兒還有其他好多有趣的東西]
下面是安裝CALLDLL包的步驟:
1. 安裝PYTHON軟體包(到現在為止最多支援2.1版本)
2. 下載calldll-2001-05-20.zip:
ftp://squirl.nightmare.com/pub/python/python-ext/calldll-2001-05-20.zip
3. 在LIB路徑下面建立一個新路徑比如說:
c:/Program Files/Python/lib/caldll/
4. 在原目錄下解壓calldll.zip
5. 移動calldll/lib/中所有的檔案到上面一個父目錄(calldll)裡面,刪除子目錄(lib)
6. 在CALL目錄裡面產生一個file __init__.py檔案,象這樣:
# File to allow this directory to be treated as a python 1.5
package.
7. 編輯calldll/odbc.py:
在"get_info_word"和"get_info_long"裡面,改變"calldll.membuf"為"windll.membuf"
下面是一個怎麼使用calldll的例子:
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
from calldll import odbc
dbc = odbc.environment().connection() # create connection
dbc.connect('sample', 'monty', 'spam') # connect to db
# alternatively, use full connect string:
# dbc.driver_connect('DSN=sample;UID=monty;PWD=spam')
print 'DBMS: %s %s/n' % ( # show DB information
dbc.get_info(odbc.SQL_DBMS_NAME),
dbc.get_info(odbc.SQL_DBMS_VER)
)
result = dbc.query( # execute query & return results
"""
SELECT country_id, name, insert_change_date
FROM country
ORDER BY name
"""
)
print 'Column descriptions:' # show column descriptions
for col in result[0]:
print ' ', col
print '/nFirst result row:/n ', result[1] # show first result row
|
output(輸出)
?
|
1
2
3
4
5
6
7 |
DBMS: Oracle 07.30.0000
Column descriptions:
('COUNTRY_ID', 3, 10, 0, 0)
('NAME', 12, 45, 0, 0)
('INSERT_CHANGE_DATE', 11, 19, 0, 1)
First result row:
['24', 'ARGENTINA', '1997-12-19 01:51:53']
|
方法四: 使用ActiveX Data Object(ADO)
現在給出一個通過Microsoft's ActiveX Data Objects (ADO)來串連MS Access 2000資料庫的執行個體.使用ADO有以下幾個好處: 首先,與DAO相比,它能更快地串連資料庫;其次,對於其他各種資料庫(SQL Server, Oracle, MySQL, etc.)來說,ADO都是非常有效而方便的;再有,它能用於XML和文字檔和幾乎其他所有資料,因此微軟也將支援它比DAO久一些.
第一件事是運行makepy.儘管這不是必須的,但是它對於提高速度有協助的.而且在PYTHONWIN裡面運行它非常簡單: 找到工具列上ToolsàCOM MakePy utilities,你會看到彈出一個Select Library的對話方塊, 在列表中選擇'Microsoft ActiveX Data Objects 2.5 Library ‘(或者是你所有的版本).
然後你需要一個資料來源名Data Source Name [DSN] 和一個連線物件. [我比較喜歡使用DSN-Less 連接字串 (與系統資料來源名相比,它更能提高效能且最佳化代碼)]
就MS Access來說,你只需要複製下面的DSN即可.對於其他資料庫,或者象密碼設定這些進階的功能來說,你需要去 [Control Panel控制台 | 管理工具Administrative Tools | 資料來源Data Sources (ODBC)]. 在那裡,你可以設定一個系統資料來源DSN. 你能夠用它作為一個系統資料來源名,或者複製它到一個字串裡面,來產生一個DSN-Less 的連接字串. 你可以在網上搜尋DSN-Less 連接字串的相關資料. 好了,這裡有一些不同資料庫的DSN-Less連接字串的例子:SQL Server, Access, FoxPro, Oracle , Oracle, Access, SQL Server, 最後是 MySQL.
?
|
1
2
3
4 |
>>> import win32com.client
>>> conn = win32com.client.Dispatch(r'ADODB.Connection')
>>> DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/MyDB.mdb;'
>>> conn.Open(DSN)
|
經過上面的設定之後,就可以直接連接資料庫了:
首要的任務是開啟一個資料集/資料表
?
|
1
2
3 |
>>> rs = win32com.client.Dispatch(r'ADODB.Recordset')
>>> rs_name = 'MyRecordset'
>>> rs.Open('[' + rs_name + ']', conn, 1, 3)
|
[1和3是常數.代表adOpenKeyset 和adLockOptimistic.我用它作為預設值,如果你的情況不同的話,或許你應該改變一下.進一步的話題請參考ADO相關材料.]
開啟資料表後,你可以檢查網域名稱和欄位名等等
?
|
1
2
3 |
>>> flds_dict = {}
>>> for x in range(rs.Fields.Count):
... flds_dict[x] = rs.Fields.Item(x).Name
|
欄位類型和長度被這樣返回A :
?
|
1
2
3
4 |
>>> print rs.Fields.Item(1).Type
202 # 202 is a text field
>>> print rs.Fields.Item(1).DefinedSize
50 # 50 Characters
|
現在開始對資料集進行操作.可以使用SQL語句INSERT INTO或者AddNew() 和Update()
?
|
1
2
3 |
>>> rs.AddNew()
>>> rs.Fields.Item(1).Value = 'data'
>>> rs.Update()
|
這些值也能夠被返回:
?
|
1
2
3 |
>>> x = rs.Fields.Item(1).Value
>>> print x
'data'
|
因此如果你想增加一條新的記錄,不必查看資料庫就知道什麼number 和AutoNumber 欄位已經產生了
?
|
1
2
3
4
5 |
>>> rs.AddNew()
>>> x = rs.Fields.Item('Auto_Number_Field_Name').Value
# x contains the AutoNumber
>>> rs.Fields.Item('Field_Name').Value = 'data'
>>> rs.Update()
|
使用ADO,你也能得到資料庫裡面所有表名的列表:
?
|
1
2
3
4
5
6 |
>>> oCat = win32com.client.Dispatch(r'ADOX.Catalog')
>>> oCat.ActiveConnection = conn
>>> oTab = oCat.Tables
>>> for x in oTab:
... if x.Type == 'TABLE':
... print x.Name
|
關閉串連. 注意這裡C是大寫,然而關閉檔案串連是小寫c.
>>> conn.Close()
前面提到,可以使用SQL語句來插入或者更新資料,這時我們直接使用一個連線物件.
?
|
1
2
3
4
5
6
7 |
>>> conn = win32com.client.Dispatch(r'ADODB.Connection')
>>> DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/MyDB.mdb;'
>>> sql_statement = "INSERT INTO [Table_Name]
([Field_1], [Field_2]) VALUES ('data1', 'data2')"
>>> conn.Open(DSN)
>>> conn.Execute(sql_statement)
>>> conn.Close()
|
最後一個例子經常被看作是ADO的痛點.一般說來,想要知道一個表的RecordCount 的話,必須象這樣一個一個地計算他們 :
?
|
1
2
3
4
5
6
7
8
9 |
>>> # See example 3 above for the set-up to this
>>> rs.MoveFirst()
>>> count = 0
>>> while 1:
... if rs.EOF:
... break
... else:
... count = count + 1
... rs.MoveNext()
|
如果你也象上面那樣些程式的話,非常底效不說,如果資料集是空的話,移動第一個記錄的操作會產生一個錯誤.ADO提供了一個方法來糾正它.在開啟資料集之前,設定CursorLocation 為3. 開啟資料集之後,就可以知道recordcount了.
?
|
1
2
3
4 |
>>> rs.Cursorlocation = 3 # don't use parenthesis here
>>> rs.Open('SELECT * FROM [Table_Name]', conn) # be sure conn is open
>>> rs.RecordCount # no parenthesis here either
186
|
[再:3是常數]
這些只用到ADO的皮毛功夫,但對於從PYTHON來串連資料庫,它還是應該有協助的.
想更進一步學習的話,建議深入物件模型.下面是一些串連:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmscadoobjmod.asp
http://www.activeserverpages.ru/ADO/dadidx01_1.htm
(逐步執行還可以,為何寫為script就不行?老巫疑惑)
方法五:使用 mxODBC模組(在Windows和Unix下面都可以用,但是是商業化軟體,要掏錢的.)下面是相關串連:
http://thor.prohosting.com/~pboddie/Python/mxODBC.html
http://www.egenix.com/files/python/mxODBC.html
方法六: 對具體的資料庫使用特定的PYTHON模組
MySQL資料庫à MySQLdb模組,為:
http://sourceforge.net/projects/mysql-python
PostgresSQL資料庫àpsycopg模組
PostgresSQL的首頁為: http://www.postgresql.org
Python/PostgresSQL模組: http://initd.org/software/psycopg
Oracle資料庫àDCOracle模組: http://www.zope.org/Products/DCOracle
àcx_oracle模組: http://freshmeat.net/projects/cx_oracle/?topic_id=809%2C66
希望本文所述對大家的Python程式設計有所協助。