本文實(shí)例講述了Python實(shí)現(xiàn)數(shù)據(jù)庫編程方法。分享給大家供大家參考。具體分析如下:
用PYTHON語言進(jìn)行數(shù)據(jù)庫編程, 至少有六種方法可供采用. 我在實(shí)際項(xiàng)目中采用,不但功能強(qiáng)大,而且方便快捷.以下是我在工作和學(xué)習(xí)中經(jīng)驗(yàn)總結(jié).
方法一:使用DAO (Data Access Objects)
這個(gè)第一種方法可能會比較過時(shí)啦.不過還是非常有用的. 假設(shè)你已經(jīng)安裝好了PYTHONWIN,現(xiàn)在開始跟我上路吧……
找到工具欄上ToolsàCOM MakePy utilities,你會看到彈出一個(gè)Select Library的對話框, 在列表中選擇'Microsoft DAO 3.6 Object Library'(或者是你所有的版本).
現(xiàn)在實(shí)現(xiàn)對數(shù)據(jù)的訪問:
1
2
3
4
5
|
#實(shí)例化數(shù)據(jù)庫引擎 import win32com.client engine = win32com.client.Dispatch( "DAO.DBEngine.35" ) #實(shí)例化數(shù)據(jù)庫對象,建立對數(shù)據(jù)庫的連接 db = engine.OpenDatabase(r "c:/temp/mydb.mdb" ) |
現(xiàn)在你有了數(shù)據(jù)庫引擎的連接,也有了數(shù)據(jù)庫對象的實(shí)例.現(xiàn)在就可以打開一個(gè)recordset了. 假設(shè)在數(shù)據(jù)庫中已經(jīng)有一個(gè)表叫做 'customers'. 為了打開這個(gè)表,對其中數(shù)據(jù)進(jìn)行處理,我們使用下面的語法:
1
2
3
|
rs = db.OpenRecordset( "customers" ) #可以采用SQL語言對數(shù)據(jù)集進(jìn)行操縱 rs = db.OpenRecordset( "select * from customers where state = 'OH'" ) |
你也可以采用DAO的execute方法. 比如這樣:
1
2
|
db.Execute( "delete * from customers where balancetype = 'overdue' and name = 'bill'" ) #注意,刪除的數(shù)據(jù)不能復(fù)原了J |
EOF 等屬性也是可以訪問的, 因此你能寫這樣的語句:
1
2
3
|
while not rs.EOF: print rs.Fields( "State" ).Value rs.MoveNext() |
我最開始采用這個(gè)方法,感覺不錯(cuò).
方法二:使用Python DB API,Python ODBC modules(you can use ODBC API directly, but maybe it is difficult for most beginner.)
為了在Python里面也能有通用的數(shù)據(jù)庫接口,DB-SIG為我們提供了Python數(shù)據(jù)庫.(欲知詳情,訪問DB-SIG的網(wǎng)站,http://www.python.org/sigs/db-sig/). Mark
Hammond的win32擴(kuò)展PythonWin里面包含了這些API的一個(gè)應(yīng)用-odbc.pyd. 這個(gè)數(shù)據(jù)庫API僅僅開放了一些有限的ODBC函數(shù)的功能(那不是它的目的),但是它使用起來很簡單,而且在win32里面是免費(fèi)的.
安裝odbc.pyd的步驟如下:
1. 安裝python軟件包:
http://www.python.org/download/
2. 安裝Mark Hammond的最新版本的python win32擴(kuò)展 - PythonWin:
http://starship.python.net/crew/mhammond/
3. 安裝必要的ODBC驅(qū)動(dòng)程序,用ODBC管理器為你的數(shù)據(jù)庫配置數(shù)據(jù)源等參數(shù)
你的應(yīng)用程序?qū)⑿枰孪葘?dǎo)入兩個(gè)模塊:
dbi.dll - 支持各種各樣的SQL數(shù)據(jù)類型,例如:日期-dates
odbc.pyd – 編譯產(chǎn)生的ODBC接口
下面有一個(gè)例子:
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 # 導(dǎo)入ODBC模塊 import time # 標(biāo)準(zhǔn)時(shí)間模塊 dbc = odbc.odbc( # 打開一個(gè)數(shù)據(jù)庫連接 'sample/monty/spam' # '數(shù)據(jù)源/用戶名/密碼' ) crsr = dbc.cursor() # 產(chǎn)生一個(gè)cursor crsr.execute( # 執(zhí)行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() # 一次取出所有的結(jié)果 print '/nFirst result row:/n ' , result[ 0 ] # 顯示結(jié)果的第一行 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)) |
下面是結(jié)果:
輸出(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看看,那兒有兩個(gè)Hirendra Hindocha寫的例子,還不錯(cuò).
注意, 這個(gè)例子中,結(jié)果值被轉(zhuǎn)化為Python對象了.時(shí)間被轉(zhuǎn)化為一個(gè)dbiDate對象.這里會有一點(diǎn)限制,因?yàn)閐biDate只能表示UNIX時(shí)間(1 Jan 1970 00:00:00 GMT)之后的時(shí)間.如果你想獲得一個(gè)更早的時(shí)間,可能會出現(xiàn)亂碼甚至引起系統(tǒng)崩潰.*_*
方法三: 使用 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調(diào)用任何動(dòng)態(tài)連接庫里面的任何函數(shù),厲害吧?哈.其實(shí),你能夠通過直接調(diào)用odbc32.dll里面的函數(shù)操作ODBC.Sam提供了一個(gè)包裝模塊odbc.py,就是來做這個(gè)事情的.也有代碼來管理數(shù)據(jù)源,安裝ODBC,實(shí)現(xiàn)和維護(hù)數(shù)據(jù)庫引擎 (Microsoft Access).在那些演示和例子代碼中,還有一些讓人側(cè)目的好東東,比如cbdemo.py,有一個(gè)信息循環(huán)和窗口過程的Python函數(shù)!
[你可以到Sam's Python Software去找到calldll的相關(guān)連接,那兒還有其他好多有趣的東西]
下面是安裝CALLDLL包的步驟:
1. 安裝PYTHON軟件包(到現(xiàn)在為止最多支持2.1版本)
2. 下載calldll-2001-05-20.zip:
ftp://squirl.nightmare.com/pub/python/python-ext/calldll-2001-05-20.zip
3. 在LIB路徑下面創(chuàng)建一個(gè)新路徑比如說:
c:/Program Files/Python/lib/caldll/
4. 在原目錄下解壓calldll.zip
5. 移動(dòng)calldll/lib/中所有的文件到上面一個(gè)父目錄(calldll)里面,刪除子目錄(lib)
6. 在CALL目錄里面生成一個(gè)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"
下面是一個(gè)怎么使用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)
現(xiàn)在給出一個(gè)通過Microsoft's ActiveX Data Objects (ADO)來連接MS Access 2000數(shù)據(jù)庫的實(shí)例.使用ADO有以下幾個(gè)好處: 首先,與DAO相比,它能更快地連接數(shù)據(jù)庫;其次,對于其他各種數(shù)據(jù)庫(SQL Server, Oracle, MySQL, etc.)來說,ADO都是非常有效而方便的;再有,它能用于XML和文本文件和幾乎其他所有數(shù)據(jù),因此微軟也將支持它比DAO久一些.
第一件事是運(yùn)行makepy.盡管這不是必須的,但是它對于提高速度有幫助的.而且在PYTHONWIN里面運(yùn)行它非常簡單: 找到工具欄上ToolsàCOM MakePy utilities,你會看到彈出一個(gè)Select Library的對話框, 在列表中選擇'Microsoft ActiveX Data Objects 2.5 Library ‘(或者是你所有的版本).
然后你需要一個(gè)數(shù)據(jù)源名Data Source Name [DSN] 和一個(gè)連接對象. [我比較喜歡使用DSN-Less 連接字符串 (與系統(tǒng)數(shù)據(jù)源名相比,它更能提高性能且優(yōu)化代碼)]
就MS Access來說,你只需要復(fù)制下面的DSN即可.對于其他數(shù)據(jù)庫,或者象密碼設(shè)置這些高級的功能來說,你需要去 [Control Panel控制面板 | 管理工具Administrative Tools | 數(shù)據(jù)源Data Sources (ODBC)]. 在那里,你可以設(shè)置一個(gè)系統(tǒng)數(shù)據(jù)源DSN. 你能夠用它作為一個(gè)系統(tǒng)數(shù)據(jù)源名,或者復(fù)制它到一個(gè)字符串里面,來產(chǎn)生一個(gè)DSN-Less 的連接字符串. 你可以在網(wǎng)上搜索DSN-Less 連接字符串的相關(guān)資料. 好了,這里有一些不同數(shù)據(jù)庫的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) |
經(jīng)過上面的設(shè)置之后,就可以直接連接數(shù)據(jù)庫了:
首要的任務(wù)是打開一個(gè)數(shù)據(jù)集/數(shù)據(jù)表
1
2
3
|
>>> rs = win32com.client.Dispatch(r 'ADODB.Recordset' ) >>> rs_name = 'MyRecordset' >>> rs. Open ( '[' + rs_name + ']' , conn, 1 , 3 ) |
[1和3是常數(shù).代表adOpenKeyset 和adLockOptimistic.我用它作為默認(rèn)值,如果你的情況不同的話,或許你應(yīng)該改變一下.進(jìn)一步的話題請參考ADO相關(guān)材料.]
打開數(shù)據(jù)表后,你可以檢查域名和字段名等等
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 |
現(xiàn)在開始對數(shù)據(jù)集進(jìn)行操作.可以使用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' |
因此如果你想增加一條新的記錄,不必查看數(shù)據(jù)庫就知道什么number 和AutoNumber 字段已經(jīng)產(chǎn)生了
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,你也能得到數(shù)據(jù)庫里面所有表名的列表:
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 |
關(guān)閉連接. 注意這里C是大寫,然而關(guān)閉文件連接是小寫的c.
>>> conn.Close()
前面提到,可以使用SQL語句來插入或者更新數(shù)據(jù),這時(shí)我們直接使用一個(gè)連接對象.
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() |
最后一個(gè)例子經(jīng)常被看作是ADO的難點(diǎn).一般說來,想要知道一個(gè)表的RecordCount 的話,必須象這樣一個(gè)一個(gè)地計(jì)算他們 :
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() |
如果你也象上面那樣些程序的話,非常底效不說,如果數(shù)據(jù)集是空的話,移動(dòng)第一個(gè)記錄的操作會產(chǎn)生一個(gè)錯(cuò)誤.ADO提供了一個(gè)方法來糾正它.在打開數(shù)據(jù)集之前,設(shè)置CursorLocation 為3. 打開數(shù)據(jù)集之后,就可以知道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是常數(shù)]
這些只用到ADO的皮毛功夫,但對于從PYTHON來連接數(shù)據(jù)庫,它還是應(yīng)該有幫助的.
想更進(jìn)一步學(xué)習(xí)的話,建議深入對象模型.下面是一些連接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmscadoobjmod.asp
http://www.activeserverpages.ru/ADO/dadidx01_1.htm
(單步執(zhí)行還可以,為何寫為script就不行?老巫疑惑)
方法五:使用 mxODBC模塊(在Windows和Unix下面都可以用,但是是商業(yè)化軟件,要掏錢的.)下面是相關(guān)連接:
http://thor.prohosting.com/~pboddie/Python/mxODBC.html
http://www.egenix.com/files/python/mxODBC.html
方法六: 對具體的數(shù)據(jù)庫使用特定的PYTHON模塊
MySQL數(shù)據(jù)庫à MySQLdb模塊,下載地址為:
http://sourceforge.net/projects/mysql-python
PostgresSQL數(shù)據(jù)庫àpsycopg模塊
PostgresSQL的主頁為: http://www.postgresql.org
Python/PostgresSQL模塊下載地址: http://initd.org/software/psycopg
Oracle數(shù)據(jù)庫àDCOracle模塊下載地址: http://www.zope.org/Products/DCOracle
àcx_oracle模塊下載地址: http://freshmeat.net/projects/cx_oracle/?topic_id=809%2C66
希望本文所述對大家的Python程序設(shè)計(jì)有所幫助。