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

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

curs = conn.cursor()


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章