天天看點

python之資料庫支援

13.1.1 全局變量

任何支援2.0版本DB API的資料庫子產品都必須定義3個描述子產品特性的全局變量。這樣做的原因時API設計的很靈活,以支援不同的基礎機制、避免過多包裝,可如果想讓程式同時應用于幾個資料庫,那可是件麻煩事了,因為需要考慮到各種可能出現的狀況。

變量名 用途

apilevel 所使用的python DB API版本

threadsafety 子產品的線程安全等級

paramstyle 在SQL查詢中使用的參數風格

API級别是個字元串常量,提供正在使用的API版本号。

線程安全性等級是個取值範圍0~3的整數。0表示線程完全不共享子產品,而3表示子產品是安全線程安全的。1表示線程本身可以共享子產品,但不對連接配接共享。如果不使用多個線程,那麼完全不用擔心這個變量。

參數風格表示執行多次類似查詢的時候,參數是如何被拼接到SQL查詢中的。

13.1.2 異常

為了能盡可能準确的處理錯誤,API中定義了一些異常類。它們被定義在一種層次結構中,是以可以通過一個except塊捕捉多種異常。

13.1.3 連接配接和遊标

為了使用基礎資料庫系統,首先必須連接配接到它。這個時候需要使用具有恰當名稱的connect函數,該函數有很多參數,而具體使用哪個參數取決于資料庫。

connect函數的常用參數

dsn 資料源名稱,給出該參數表示資料庫依賴

user 使用者名

password 使用者密碼

host 主機名

database 資料庫名

connect函數傳回連接配接對象,這個對象表示目前和資料庫的會話。

連接配接對象方法

close() 關閉連接配接之後,連接配接對象和它的遊标均不可用

commit() 如果支援的話就送出挂起的事務,否則不做任何事

rollback() 復原挂起的事務(可能不可用)

cursor() 傳回連接配接的遊标對象

cursor方法将我們引入另外一個主題:遊标對象。通過遊标執行sql查詢并檢查結果。遊标比連接配接支援更多的方法。

13.1.4 類型

資料庫對插入到具有某種類型的列中的值有不同的要求,是為了能正确地與基礎sql資料庫進行互動操作,DB API定義了用于特殊類型和值的構造函數及常量。

13.2.1 入門

這裡以SQLite資料庫作為示例。

将SQLite作為名為sqlite3的子產品導入。之後就可以建立一個到資料庫檔案的連接配接----如果檔案不存在就會被建立----通過提供一個檔案名:

>>>import sqlite3

>>>conn = sqlite3.connect('somedatabase.db')

之後就能獲得連接配接的遊标:

>>>curs = conn.cursor()

這個遊标可以用來執行sql查詢,完成查詢并且做出某些更改後確定已經進行了送出,這樣才可以将這些修改真正的儲存到檔案中:

>>>conn.commit()

可以在每次修改資料庫後都進行送出,而不是僅僅在準備關閉時才送出,準備關閉資料庫時,使用close方法:

>>>conn.close()

13.2.2 資料庫應用程式示例

1.建立和填充表

為了真正地建立資料庫表并且向其中插入資料,寫個完全獨立的一次程式可能是最簡單的方案。

下面程式建立了叫做food的表和适當的字段,并且從ABBREV.txt中讀取資料。之後分解析,然後通過調用curs.execute執行SQL的INSERT語句将文本字段中的值插入到資料庫中。

将資料導入資料庫

import sqlite3

def convert(value)

if value.startswith('~'):

return value.strip('~')

if not value:

value = '0'

return float(value)

conn = sqlite3.connect('food.db')

curs = conn.cursor()

curs.execute('''

CREATE TABLE food (

id TEXT PRIMARY KEY,

desc TEXT,

water FLOAT,

kcal FLOAT,

ash FLOAT,

fiber FLOAT

)

''')

query = 'INSERT INTO food VALUES(?,?,?,?,?,?)'

for line in open('ABBREV.txt'):

fileds = line.split('^')

vals = [convert(f) for f in fileds[:filed_count]]

curs.execute(query,vals)

conn.commit()

conn.close()

當運作這個程式時,它會建立一個叫做food.db的新檔案,它包含資料庫中的所有資料。

2.搜尋和處理結果

使用資料庫很簡單。再說一次,需要建立連接配接并且獲得該連結的遊标。使用execute方法執行sql查詢,用fetchall等方法提取結果。

展示一個将SQL SELECT條件查詢作為指令行參數,之後按記錄格式列印出傳回行的小程式。可以用下面的指令嘗試這個程式:

$python food_query.py "kcal <= 100 AND fiber >= 10 ORDER BY sugar"

運作的時候可能注意到有個問題。第一行,生橘子皮看起來不含任何糖分,這是因為在資料檔案中這個字段丢失了。可以改進剛才的導入腳本檢測條件,然後插入None帶代替真實的值來表示丢失的資料。可以使用如下條件:

"kcal <= 100 AND fiber >= 10 AND sugar ORDER BY sugar"

請求在任何傳回行中包含實際資料的糖分字段。

食品資料庫查詢程式(food_query.py)

import sqlite3,sys

query = 'SELECT * FROM food WHERE %s' % sys.argv[1]

print query

curs.execute(query)

names = [f[0] for f in curs.description]

for row in curs.fetchall():

for pair in zip(names,row):

print '%s: %s' % pair

print

      本文轉自潘闊 51CTO部落格,原文連結:http://blog.51cto.com/pankuo/1661447,如需轉載請自行聯系原作者