欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實現(xiàn)數(shù)據(jù)庫編程方法詳解

 更新時間:2015年06月09日 10:12:36   作者:adupt  
這篇文章主要介紹了Python實現(xiàn)數(shù)據(jù)庫編程方法,較為詳細(xì)的總結(jié)了Python數(shù)據(jù)庫編程涉及的各種常用技巧與相關(guān)組件,需要的朋友可以參考下

本文實例講述了Python實現(xiàn)數(shù)據(jù)庫編程方法。分享給大家供大家參考。具體分析如下:

用PYTHON語言進(jìn)行數(shù)據(jù)庫編程, 至少有六種方法可供采用. 我在實際項目中采用,不但功能強大,而且方便快捷.以下是我在工作和學(xué)習(xí)中經(jīng)驗總結(jié).

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

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

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

現(xiàn)在實現(xiàn)對數(shù)據(jù)的訪問:

#實例化數(shù)據(jù)庫引擎
import win32com.client
engine = win32com.client.Dispatch("DAO.DBEngine.35")
#實例化數(shù)據(jù)庫對象,建立對數(shù)據(jù)庫的連接
db = engine.OpenDatabase(r"c:/temp/mydb.mdb")

現(xiàn)在你有了數(shù)據(jù)庫引擎的連接,也有了數(shù)據(jù)庫對象的實例.現(xiàn)在就可以打開一個recordset了. 假設(shè)在數(shù)據(jù)庫中已經(jīng)有一個表叫做 'customers'. 為了打開這個表,對其中數(shù)據(jù)進(jìn)行處理,我們使用下面的語法:

rs = db.OpenRecordset("customers")
#可以采用SQL語言對數(shù)據(jù)集進(jìn)行操縱
rs = db.OpenRecordset("select * from customers where state = 'OH'")

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

db.Execute("delete * from customers where balancetype = 'overdue' and name = 'bill'")
#注意,刪除的數(shù)據(jù)不能復(fù)原了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里面也能有通用的數(shù)據(jù)庫接口,DB-SIG為我們提供了Python數(shù)據(jù)庫.(欲知詳情,訪問DB-SIG的網(wǎng)站,http://www.python.org/sigs/db-sig/).   Mark

Hammond的win32擴展PythonWin里面包含了這些API的一個應(yīng)用-odbc.pyd. 這個數(shù)據(jù)庫API僅僅開放了一些有限的ODBC函數(shù)的功能(那不是它的目的),但是它使用起來很簡單,而且在win32里面是免費的.

安裝odbc.pyd的步驟如下:

1. 安裝python軟件包:

http://www.python.org/download/

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

http://starship.python.net/crew/mhammond/

3. 安裝必要的ODBC驅(qū)動程序,用ODBC管理器為你的數(shù)據(jù)庫配置數(shù)據(jù)源等參數(shù)

你的應(yīng)用程序?qū)⑿枰孪葘?dǎo)入兩個模塊:

   dbi.dll   - 支持各種各樣的SQL數(shù)據(jù)類型,例如:日期-dates
   odbc.pyd – 編譯產(chǎn)生的ODBC接口

下面有一個例子:

import dbi, odbc   # 導(dǎo)入ODBC模塊
import time      # 標(biāo)準(zhǔn)時間模塊
dbc = odbc.odbc(   # 打開一個數(shù)據(jù)庫連接
    'sample/monty/spam'  # '數(shù)據(jù)源/用戶名/密碼'
    )
crsr = dbc.cursor()  # 產(chǎn)生一個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)

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寫的例子,還不錯.

注意, 這個例子中,結(jié)果值被轉(zhuǎn)化為Python對象了.時間被轉(zhuǎn)化為一個dbiDate對象.這里會有一點限制,因為dbiDate只能表示UNIX時間(1 Jan 1970 00:00:00 GMT)之后的時間.如果你想獲得一個更早的時間,可能會出現(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)用任何動態(tài)連接庫里面的任何函數(shù),厲害吧?哈.其實,你能夠通過直接調(diào)用odbc32.dll里面的函數(shù)操作ODBC.Sam提供了一個包裝模塊odbc.py,就是來做這個事情的.也有代碼來管理數(shù)據(jù)源,安裝ODBC,實現(xiàn)和維護(hù)數(shù)據(jù)庫引擎 (Microsoft Access).在那些演示和例子代碼中,還有一些讓人側(cè)目的好東東,比如cbdemo.py,有一個信息循環(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)建一個新路徑比如說:

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)

現(xiàn)在給出一個通過Microsoft's ActiveX Data Objects (ADO)來連接MS Access 2000數(shù)據(jù)庫的實例.使用ADO有以下幾個好處: 首先,與DAO相比,它能更快地連接數(shù)據(jù)庫;其次,對于其他各種數(shù)據(jù)庫(SQL Server, Oracle, MySQL, etc.)來說,ADO都是非常有效而方便的;再有,它能用于XML和文本文件和幾乎其他所有數(shù)據(jù),因此微軟也將支持它比DAO久一些.

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

然后你需要一個數(shù)據(jù)源名Data Source Name [DSN] 和一個連接對象. [我比較喜歡使用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è)置一個系統(tǒng)數(shù)據(jù)源DSN. 你能夠用它作為一個系統(tǒng)數(shù)據(jù)源名,或者復(fù)制它到一個字符串里面,來產(chǎn)生一個DSN-Less 的連接字符串. 你可以在網(wǎng)上搜索DSN-Less 連接字符串的相關(guān)資料. 好了,這里有一些不同數(shù)據(jù)庫的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)

經(jīng)過上面的設(shè)置之后,就可以直接連接數(shù)據(jù)庫了:

首要的任務(wù)是打開一個數(shù)據(jù)集/數(shù)據(jù)表

>>> 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ù)表后,你可以檢查域名和字段名等等

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

現(xiàn)在開始對數(shù)據(jù)集進(jìn)行操作.可以使用SQL語句INSERT INTO或者AddNew() 和Update()

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

這些值也能夠被返回:

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

因此如果你想增加一條新的記錄,不必查看數(shù)據(jù)庫就知道什么number 和AutoNumber 字段已經(jīng)產(chǎn)生了

>>> 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ù)庫里面所有表名的列表:

>>> 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ù),這時我們直接使用一個連接對象.

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

最后一個例子經(jīng)常被看作是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()

如果你也象上面那樣些程序的話,非常底效不說,如果數(shù)據(jù)集是空的話,移動第一個記錄的操作會產(chǎn)生一個錯誤.ADO提供了一個方法來糾正它.在打開數(shù)據(jù)集之前,設(shè)置CursorLocation 為3. 打開數(shù)據(jù)集之后,就可以知道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是常數(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è)計有所幫助。

相關(guān)文章

  • Python使用progressbar模塊實現(xiàn)的顯示進(jìn)度條功能

    Python使用progressbar模塊實現(xiàn)的顯示進(jìn)度條功能

    這篇文章主要介紹了Python使用progressbar模塊實現(xiàn)的顯示進(jìn)度條功能,簡單介紹了progressbar模塊的安裝,并結(jié)合實例形式分析了Python使用progressbar模塊顯示進(jìn)度條的相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Python+folium繪制精美地圖的示例詳解

    Python+folium繪制精美地圖的示例詳解

    folium是一個基于leaflet.js的python地圖庫,可以通過folium來操縱數(shù)據(jù),并將其可視化。本文將通過各種示例詳細(xì)講解如何利用folium繪制精美地圖,需要的可以參考一下
    2022-03-03
  • python調(diào)用fortran模塊

    python調(diào)用fortran模塊

    本文給大家介紹的是在Python中調(diào)用fortran代碼,主要是用到了f2py這個程序,十分的實用,有需要的小伙伴可以參考下
    2016-04-04
  • python中的單引號雙引號區(qū)別知識點總結(jié)

    python中的單引號雙引號區(qū)別知識點總結(jié)

    在本篇文章中小編給大家整理了關(guān)于python中的單引號雙引號有什么區(qū)別的相關(guān)知識點以及實例代碼,需要的朋友們參考下。
    2019-06-06
  • Python創(chuàng)建一個空的dataframe,并循環(huán)賦值的方法

    Python創(chuàng)建一個空的dataframe,并循環(huán)賦值的方法

    今天小編就為大家分享一篇Python創(chuàng)建一個空的dataframe,并循環(huán)賦值的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 基于python list對象中嵌套元組使用sort時的排序方法

    基于python list對象中嵌套元組使用sort時的排序方法

    下面小編就為大家分享一篇基于python list對象中嵌套元組使用sort時的排序方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python簡單計算給定某一年的某一天是星期幾示例

    Python簡單計算給定某一年的某一天是星期幾示例

    這篇文章主要介紹了Python簡單計算給定某一年的某一天是星期幾,涉及Python基于蔡勒公式的簡單日期數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • 如何將Python字符串轉(zhuǎn)換為JSON的實現(xiàn)方法

    如何將Python字符串轉(zhuǎn)換為JSON的實現(xiàn)方法

    在本教程中,你將學(xué)習(xí)JSON的基礎(chǔ)知識,它是什么,常用在哪里以及它的語法,還將看到如何在Python中將字符串轉(zhuǎn)換為JSON,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 深入了解Python在HDA中的應(yīng)用

    深入了解Python在HDA中的應(yīng)用

    這篇文章主要介紹了深入了解Python在HDA中的應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python的列表和元組詳情

    Python的列表和元組詳情

    這篇文章主要介紹了Python的列表和元組,列表和元組是python組常見的內(nèi)置內(nèi)省,下面文章我們講圍繞Python的列表和元組的相關(guān)資料展開話題,感興趣的小伙伴以參考一下
    2021-10-10

最新評論