第13章 資料庫支援

2021-10-13 15:29:22 字數 4287 閱讀 9912

為了解決不同資料庫模組的介面(api)不同的問題,指定了標準資料庫api(db api)

1. 全域性變數

所有與db api2.0相容的資料庫模組必須包含3個全域性變數:

apilevel:使用的python api版本,是乙個字串常量。db api 2.0指出,這個變數的值為'1.0'或'2.0'。如果沒有這個變數,就說明模組不與db api 2.0相容,應假定使用的是db api 1.0。編寫**時,允許這個變數為其他值也沒有害處,因為說不定什麼時候b api 3.0就出來了。

threadsafety:執行緒安全程度,是乙個0~3(含)的整數。 0表示執行緒不能共享模組;1表示執行緒可共享模組本身,但不能共享連線;2表示執行緒可共享模組和連線,但不能共享游標;3表示模組是絕對執行緒安全的。

paramstyle:引數風格表示當你執行多個類似的資料庫查詢時,如何在sql查詢中插入引數。 '例如format'表示標準字串格式設定方式(使用基本的格式編碼),如在要插入引數的地方插入%s。

2. 異常

python db api指定的異常 異常

超類描述

standarderror

所有異常的超類

warning

standarderror

發生非致命問題時引發

error

standarderror

所有錯誤條件的超類

inte***ceerror

error

與介面(而不是資料庫)相關的錯誤

databaseerror

error

與資料庫相關的錯誤的超類

dataerror

databaseerror

與資料相關的問題,如值不在合法的範圍內

operationalerror

databaseerror

資料庫操作內部的錯誤

integrityerror

databaseerror

關係完整性遭到破壞,如鍵未通過檢查

internalerror

databaseerror

資料庫內部的錯誤,如游標無效

programmingerror

databaseerror

使用者程式設計錯誤,如未找到資料庫表

notsupportederror

databaseerror

請求不支援的功能,如回滾

2. 連線和游標

連線資料庫系統,函式connect返回乙個連線物件。

函式connect的常用引數

引數名描述是否可選

dsn資料來源名稱,具體含義隨資料庫而異

否user

使用者名稱是

password

使用者密碼

是host

主機名是

database

資料庫名稱

是連線物件的方法

方法名描述close()

關閉連線物件。之後,連線物件及其游標將不可用

commit()

提交未提交的事務——如果支援的話;否則什麼都不做

rollback()

回滾未提交的事務(可能不可用)

cursor

返回連線的游標物件

游標物件的方法 名稱

描述callproc(name[, params]) 

使用指定的引數呼叫指定的資料庫過程(可選)

close() 

關閉游標。關閉後游標不可用

execute(oper[, params]) 

執行乙個sql

操作——可能指定引數

executemany(oper, pseq) 

執行指定的sql

操作多次,每次都序列中的一組引數

fetchone() 

以序列的方式取回查詢結果中的下一行;如果沒有更多的行,就返回none

fetchmany([size]) 

取回查詢結果中的多行,其中引數size

的值預設為

arraysize

fetchall() 

以序列的序列的方式取回餘下的所有行

nextset() 

跳到下乙個結果集,這個方法是可選的

setinputsizes(sizes) 

用於為引數預定義記憶體區域

setoutputsize(size[, col]) 

為取回大量資料而設定緩衝區長度

游標物件的屬性 名稱

描述description

由結果列描述組成的序列(唯讀)

rowcount

結果包含的行數

arraysize

fetchmany返回的行數,預設為1

4. 型別

#匯入模組

import sqlite3

#建立連線

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

#獲取游標

curs = conn.cursor()

#提交修改

conn.commit()

#關閉連線

conn.close()

例:建立小型的營養成文資料庫

資料**美國農業部的檔案abbrev.txt,該檔案的結構為:每行都是一條資料記錄,字段之間用脫字元( ^)分隔。數字字段直接包含數字,而文字欄位用兩個波浪字元( ~)將其字串值括起。下面是乙個示例行(為簡潔起見刪除了部分內容):

~07276~^~hormel spam ... pork w/ ham minced ***~^ ... ^~1 serving~^^~~^0

將資料匯入資料庫:

在**清單13-1中,使用的引數風格為qmark,即使用問號來標記字段。

#importdata.py

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,

protein float,

fat float,

ash float,

carbs float,

fiber float,

sugar float

)''')

query = 'insert into food values (?,?,?,?,?,?,?,?,?,?)'

field_count = 10

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

fields = line.split('^')

vals = [convert(f) for f in fields[:field_count]]

curs.execute(query, vals)

conn.commit()

conn.close()

搜尋並處理結果:

import sqlite3, sys

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

curs = conn.cursor()

query = 'select * from food where ' + sys.ar**[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('{}: {}'.format(*pair))

print()

使用

>>>python food_query.py "kcal <= 100 and fiber >= 10 order by sugar"

第13章 資料庫支援

13.1 python資料庫api 13.2 sqlite和pysqlite sqlite小型資料庫引擎,可直接使用本地檔案,而不需要集中式資料庫儲存機制。使用模組sqlite3實現的pysqlite。13.2.1 起步 import sqlite3 建立直接到資料庫檔案的連線 conn sqlit...

第13章 資料庫連線池(Druid)

spring boot 系列學習記錄 druid是乙個關係型資料庫連線池,它是阿里巴巴的乙個開源專案。druid支援所有jdbc相容資料庫,包括了oracle mysql postgresql sql server h2等。druid在監控 可擴充套件性 穩定性和效能方面具有明顯的優勢。通過drui...

資料庫實驗第13周

有待改善的學生表。介面 增 刪 我剛開始想刪乙個以前存的,發現會報錯,在sql server中輸入對應的刪除語句,發現是因為該學生有選課記錄。然後我就刪除的新插入的那個學生,結果成功了,因為該學生還沒有選課記錄。改 查 增刪改查 private void buttoninsert click obj...