天天看點

用Python實作資料庫程式設計

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

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

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

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

現在實作對資料的通路:

    #執行個體化資料庫引擎

    import win32com.client

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

    #執行個體化資料庫對象,建立對資料庫的連接配接

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

現在你有了資料庫引擎的連接配接,也有了資料庫對象的執行個體.現在就可以打開一個recordset了. 假設在資料庫中已經有一個表叫做 'customers'. 為了打開這個表,對其中資料進行處理,我們使用下面的文法:

    rs = db.OpenRecordset("customers")

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

    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 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接口

下面有一個例子:

   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', <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 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_word"和"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.driver_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: 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.

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

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

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

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

>>> rs_name = 'MyRecordset'

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

1和3是常數.代表adOpenKeyset 和adLockOptimistic