用Python實現資料庫程式設計 (轉)

gugu99發表於2007-08-17
用Python實現資料庫程式設計 (轉)[@more@]

老巫 .09.10:namespace prefix = o ns = "urn:schemas--com::office" />

19 September, 2003

 

用PYTHON語言進行資料庫程式設計, 至少有六種方法可供採用. 我在實際專案中採用,不但功能強大,而且方便快捷.以下是我在工作和學習中總結.

方法一:使用DAO (Data Access s)

這個第一種方法可能會比較過時啦.不過還是非常有用的. 假設你已經好了PYTHONWIN,現在開始跟我上路吧……

找到工具欄上ToolsàMakePy utilities,你會看到彈出一個 Library的對話方塊, 在列表中選擇'Microsoft DAO 3.6 Object Library'(或者是你所有的版本).

現在實現對資料的訪問:

  #例項化資料庫引擎

  import com.client

engine = win32com.client.Dispatch("DAO.Engine.35")

  #例項化資料庫,建立對資料庫的連線

  db = engine.OpenDatabase(r"c: empmydb.mdb")

現在你有了資料庫引擎的連線,也有了資料庫物件的例項.現在就可以開啟一個recordset了. 假設在資料庫中已經有一個表叫做 'customers'. 為了開啟這個表,對其中資料進行處理,我們使用下面的語法:

  rs = db.OpenRecordset("customers")

  #可以採用語言對資料集進行操縱

  rs = db.OpenRecordset("select * from customers where state = 'OH'")

你也可以採用DAO的execute方法. 比如這樣:

  db.Execute("delete * from customers where balancetype = 'overdue' and name = 'bill'")

  #注意,刪除的資料不能復原了J

EOF 等屬性也是可以訪問的, 因此你能寫這樣的語句:

  while not rs.EOF:

  print rs.Fields("State").Value

  rs.MoveNext()

我最開始採用這個方法,感覺不錯.

方法二:使用Python DB ,Python ODBC modules(you can use ODBC API directly, but maybe it is difficult for most beginner.)

為了在Python裡面也能有通用的資料庫介面,DB-SIG為我們提供了Python資料庫.(欲知詳情,訪問DB-SIG的網站,).  Mark

Hammond的win32擴充套件PythonWin裡面包含了這些API的一個應用-odbc.pyd. 這個資料庫API僅僅開放了一些有限的ODBC的功能(那不是它的目的),但是它使用起來很簡單,而且在win32裡面是免費的.

安裝odbc.pyd的步驟如下:

  1. 安裝python包:

  /python/win32/python15.exe"> 

  2. 安裝Mark Hammond的最新版本的python win32擴充套件 - PythonWin:

  /win32all"> 

  3. 安裝必要的ODBC,用ODBC管理器為你的資料庫資料來源等引數

你的應用程式將需要事先匯入兩個模組:

  dbi.dll  - 支援各種各樣的SQL資料型別,例如:日期-dates

 odbc.pyd – 編譯產生的ODBC介面

下面有一個例子:

  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 ' First result row: ', result[0]  # 顯示結果的第一行

  print ' Date 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)----------------------------

  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', )

  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

大家也可以去看看,那兒有兩個Hirendra Hindocha寫的例子,還不錯.

注意, 這個例子中,結果值被轉化為Python物件了.時間被轉化為一個dbiDate物件.這裡會有一點限制,因為dbiDate只能表示時間(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. 老巫:-)

to:rushing@squrl.nightmare.com">Sam Rushing的calldll模組可以讓Python任何動態連線庫裡面的任何函式,厲害吧?哈.其實,你能夠透過直接呼叫odbc32.dll裡面的函式操作ODBC.Sam提供了一個包裝模組odbc.py,就是來做這個事情的.也有程式碼來管理資料來源,安裝ODBC,實現和維護資料庫引擎 (Microsoft Access).在那些演示和例子程式碼中,還有一些讓人側目的好東東,比如cbdemo.py,有一個資訊迴圈和視窗過程的Python函式!

[你可以到Sam's 去找到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 FilesPythonlibcaldll

  4. 在原目錄下解壓calldll.zip

  5. 移動calldlllib中所有的到上面一個父目錄(calldll)裡面,刪除子目錄(lib)

  6. 在CALL目錄裡面生成一個file __init__.py檔案,象這樣:

  # File to allow this directory to be treated as a python 1.5

package.

  7. 編輯calldllodbc.py:

  在"get_info_"和"get_info_long"裡面,改變"calldll.membuf"為"windll.membuf"

下面是一個怎麼使用calldll的例子:

  from calldll import odbc

  dbc = odbc.environment().connection()  # create connection

  dbc.connect('sample', 'monty', 'spam')  # connect to db

  # alternatively, use full connect string:

  # dbc._connect('DSN=sample;UID=monty;PWD=spam')

  print 'DBMS: %s %s ' % (  # 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 ' First result row: ', result[1]  # show first result row

 -------------------------------output(輸出)--------------------------------

  DBMS: 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']

方法四: 使用 Data Object(ADO)

現在給出一個透過Microsoft's ActiveX Data Objects (ADO)來連線MS Access 2000資料庫的例項.使用ADO有以下幾個好處: 首先,與DAO相比,它能更快地連線資料庫;其次,對於其他各種資料庫(, Oracle, , etc.)來說,ADO都是非常有效而方便的;再有,它能用於XML和文字檔案和幾乎其他所有資料,因此也將支援它比DAO久一些.

第一件事是執行makepy.儘管這不是必須的,但是它對於提高速度有幫助的.而且在PYTHONWIN裡面執行它非常簡單: 找到工具欄上ToolsàCOM MakePy utilities,你會看到彈出一個Select Library的對話方塊, 在列表中選擇’Microsoft ActiveX Data Objects 2.5 Library ‘(或者是你所有的版本).

然後你需要一個資料來源名Data Name [DSN] 和一個連線物件. [我比較喜歡使用DSN-Less 連線字串 (與系統資料來源名相比,它更能提高且程式碼)]
就MS Access來說,你只需要複製下面的DSN即可.對於其他資料庫,或者象密碼設定這些高階的功能來說,你需要去 [Control Panel控制皮膚 | 管理工具Administrative Tools | 資料來源Data Sources (ODBC)]. 在那裡,你可以設定一個系統資料來源DSN. 你能夠用它作為一個系統資料來源名,或者複製它到一個字串裡面,來產生一個DSN-Less 的連線字串. 你可以在網上搜尋.com/custom?q=dsn-less+connection+string&cof=T%3A%23000000%3BLW%3A200%3BALC%3A%2300b6ff%3BL%3Ahttp%3A%2F%2F%2Fimages%2F0000_000.jpg%3BLC%3A%230000ff%3BLH%3A141%3BBGC%3A%23ffffff%3BAH%3ACenter%3BVLC%3A%2300b6ff%3BG%20">DSN-Less 連線字串的相關資料. 好了,這裡有一些不同資料庫的DSN-Less連線字串的例子: , , .net/-samples/database-connection-strings.asp">Access, SQL Server, 最後是 MySQL.

>>> import win32com.client

>>> conn = win32com.client.Dispatch(r'ADODB.Connection')

>>> DSN = 'PROVR=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/MyDB.mdb;'

>>> conn.Open(DSN)

經過上面的設定之後,就可以直接連線資料庫了:

首要的任務是開啟一個資料集/資料表

>>> rs = win32com.client.Dispatch(r'ADODB.Recordset')

>>> rs_name = 'MyRecordset'

>>> rs.Open('[' + rs_name + ']', conn, 1, 3)

 

[1和3是常數.代表adOpenKeysetadLockOptimistic.我用它作為預設值,如果你的情況不同的話,或許你應該改變一下.進一步的話題請參考ADO相關材料.]

開啟資料表後,你可以檢查域名和欄位名等等

>>> flds_dict = {}

>>> for x in range(rs.Fields.Count):

 ...  flds_dict[x] = rs.Fields.Item(x).Name

 

欄位型別和長度被這樣返回A :

>>> 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()

>>> rs.AddNew()

>>> rs.Fields.Item(1).Value = 'data'

>>> rs.Update()

這些值也能夠被返回:

>>> x = rs.Fields.Item(1).Value

>>> print x

'data'

 

因此如果你想增加一條新的記錄,不必檢視資料庫就知道什麼number 和AutoNumber 欄位已經產生了

>>> 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,你也能得到資料庫裡面所有表名的列表:

  >>> 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語句來插入或者資料,這時我們直接使用一個連線物件.

 >>> 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 的話,必須象這樣一個一個地計算他們 :

>>> # 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了.

  >>> 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來連線資料庫,它還是應該有幫助的.

想更進一步學習的話,建議深入物件模型.下面是一些連線:

(單步執行還可以,為何寫為script就不行?老巫疑惑)

方法五:使用 mxODBC模組(在Windows和Unix下面都可以用,但是是商業化軟體,要掏錢的.)下面是相關連線:

方法六: 對具體的資料庫使用特定的PYTHON模組

MySQL資料庫à MySQLdb模組,下載地址為:

PostgresSQL資料庫àpsycopg模組

PostgresSQL的主頁為:

Python/PostgresSQL模組下載地址:

Oracle資料庫àDCOracle模組下載地址:

  àcx_oracle模組下載地址:

 

=======================================
版權所有 @ Copyright 老巫 2003
本文可原封不動的複製和自由地再發行,但在複製和再發行的複製中必須
原封不動地含有這段版權宣告。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963302/,如需轉載,請註明出處,否則將追究法律責任。

相關文章