程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> Python實現數據庫編程

Python實現數據庫編程

編輯: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:\temp\mydb.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 '\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)----------------------------
  
  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
  
  大家也可以去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的例子:
  
  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(輸出)--------------------------------
  
  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.我用它作為默認值,如果你的情況不同的話,或許你應該改變一下.進一步的話題請參考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
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved