第十三章 數據庫支持

第十三章 數據庫支持

本章討論Python數據庫API(一種連接到SQL數據庫的標準化方式),并演示如何使用這個API來執行一些基本的SQL。最后,本章將討論其他一些數據庫技術。
關Python支持的數據庫清單

Python數據庫API

標準數據庫API(DB API)
Python官方維基百科中的數據庫編程指南

全局變量

變量名描述
apilevel使用的Python DB API版本;是一個字符串常量,指出了使用的API版本。
threadsafety模塊的線程安全程度如何;是一個0~3(含)的整數。0表示線程不能共享模塊,而3表示模塊是絕對線程安全的。1表示線程可共享模塊本身,但不能共享連接,而2表示線程可共享模塊和連接,但不能共享游標。
paramstyle在SQL查詢中使用哪種參數風格;format’表示標準字符串格式設置方式(使用基本的格式編碼),如在要插入參數的地方插入%s。'pyformat’表示擴展的格式編碼,即舊式字典插入使用的格式編碼,如%(foo)s;'qmark’表示使用問號,'numeric’表示使用:1和:2這樣的形式表示字段(其中的數字是參數的編號),而’named’表示使用:foobar這樣的形式表示字段(其中foobar為參數名)

異常

異常超類描述
StandardError所有異常的超類
WarningStandardError發生非致命問題時引發
ErrorStandardError所有錯誤條件的超類
InterfaceErrorError與接口(而不是數據庫)相關的錯誤
DatabaseErrorError與數據庫相關的錯誤的超類
DataErrorDatabaseError與數據相關的問題,如值不在合法的范圍內
OperationalErrorDatabaseError數據庫操作內部的錯誤
IntegrityErrorDatabaseError關系完整性遭到破壞,如鍵未通過檢查
InternalErrorDatabaseError數據庫內部的錯誤,如游標無效
ProgrammingErrorDatabaseError用戶編程錯誤,如未找到數據庫表
NotSupportedErrorDatabaseError請求不支持的功能,如回滾

連接和游標

要使用底層的數據庫系統,必須先連接到它,為此可使用名稱貼切的函數connect。接受多個參數,具體是哪些取決于要使用的數據庫。
函數connect的常用參數

參數名描述是否可選
dsn數據源名稱,具體含義隨數據庫而異
user用戶名
password用戶密碼
host主機名
database數據庫名稱

函數connect返回一個連接對象,表示當前到數據庫的會話。
連接對象的方法

方法名描述
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結果包含的行數(只讀)
arraysizefetchmany返回的行數,默認為1

類型

DB API構造函數和特殊值

名稱描述
Date(year, month, day)創建包含日期值的對象
Time(hour, minute, second)創建包含時間值的對象
Timestamp(y, mon, d, h, min, s)創建包含時間戳的對象
DateFromTicks(ticks)根據從新紀元開始過去的秒數創建包含日期值的對象
TimeFromTicks(ticks)根據從新紀元開始過去的秒數創建包含時間值的對象
imestampFromTicks(ticks)根據從新紀元開始過去的秒數創建包含時間戳的對象
Binary(string)創建包含二進制字符串值的對象
STRING描述基于字符串的列(如CHAR)
BINARY描述二進制列(如LONG或RAW)
NUMBER描述數字列
DATETIME描述日期/時間列
ROWID描述行ID列

SQLite和PySQLite

起步

導入模塊sqlite3來導入Python標準庫中的SQLit

import sqlite3#導入模塊sqlite3
conn = sqlite3.connect('beyond.db')#連接數據庫,若數據庫不存在則自動創建
curs = conn.cursor()#從連接獲得游標,這個游標可用來執行SQL查詢。
conn.commit()#在每次修改數據庫后都進行提交
conn.close()#關閉連接

數據庫應用程序示例

ABBREV.txt數據庫信息放在與程序同一個目錄下
ABBREV.txt
在文件ABBREV.txt中,每行都是一條數據記錄,字段之間用脫字符(^)分隔。
數字字段直接包含數字,而文本字段用兩個波浪字符(~)將其字符串值括起。

將這個ASCII文件中的數據轉換為SQL數據庫
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, 
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()

當你運行這個程序時(文件ABBREV.txt和它位于同一個目錄),它將新建一個名為food.db的文件,其中包含數據庫中的所有數據。

2,搜索并處理結果

數據庫查詢程序

import sqlite3,sys 
conn = sqlite3.connect('food.db') 
curs = conn.cursor() 
query = 'SELECT * FROM food WHERE ' + 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('{}: {}'.format(*pair)) print()

小結

概念解釋
Python DB API這個API定義了一個簡單的標準化接口,所有數據庫包裝器模塊都必須遵循它,這讓編寫使用多個不同數據庫的程序更容易。
連接連接對象表示到SQL數據庫的通信鏈路,使用方法cursor可從連接獲得游標。你還可使用連接對象來提交或回滾事務。使用完數據庫后,就可將連接關閉了。
游標游標用于執行查詢和查看結果。可逐行取回查詢結果,也可一次取回很多(或全部)行。
類型和特殊值DB API指定了一組構造函數和特殊值的名稱。構造函數用于處理日期和時間對象,還有二進制數據對象;而特殊值用于表示關系型數據庫的類型,如STRING、NUMBER和DATETIME。
SQLite這是一個小型的嵌入式SQL數據庫,標準Python發行版中包含其Python包裝器,即模塊sqlite3。這個數據庫速度快、易于使用,且不要求搭建專門的服務器。

本章介紹的函數

函數描述
connect(…)連接到數據庫并返回一個連接對象

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378286.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378286.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378286.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【神經網絡八股擴展】:自制數據集

課程來源:人工智能實踐:Tensorflow筆記2 文章目錄前言1、文件一覽2、將load_data()函數替換掉2、調用generateds函數4、效果總結前言 本講目標:自制數據集,解決本領域應用 將我們手中的圖片和標簽信息制作為可以直接導入的npy文件。 1、文件一覽 首先看…

java 批量處理 示例_Java中異常處理的示例

java 批量處理 示例Here, we will analyse some exception handling codes, to better understand the concepts. 在這里,我們將分析一些異常處理代碼 ,以更好地理解這些概念。 Try to find the errors in the following code, if any 嘗試在以下代碼中…

hdu 1465 不容易系列之一

http://acm.hdu.edu.cn/showproblem.php?pid1465 今天立神和我們講了錯排,才知道錯排原來很簡單,從第n個推起: 當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用M(n)表示,那么M(n-1)就表示n-1個編號元素放在n-1個編號位置…

第十四章 網絡編程

第十四章 網絡編程 本章首先概述Python標準庫中的一些網絡模塊。然后討論SocketServer和相關的類,并介紹同時處理多個連接的各種方法。最后,簡單地說一說Twisted,這是一個使用Python編寫網絡程序的框架,功能豐富而成熟。 幾個網…

c語言輸出11258循環,c/c++內存機制(一)(轉)

一:C語言中的內存機制在C語言中,內存主要分為如下5個存儲區:(1)棧(Stack):位于函數內的局部變量(包括函數實參),由編譯器負責分配釋放,函數結束,棧變量失效。(2)堆(Heap):由程序員用…

【神經網絡八股擴展】:數據增強

課程來源:人工智能實踐:Tensorflow筆記2 文章目錄前言TensorFlow2數據增強函數數據增強網絡八股代碼:總結前言 本講目標:數據增強,增大數據量 關于我們為何要使用數據增強以及常用的幾種數據增強的手法,可以看看下面的文章&#…

C++:從C繼承的標準庫

C從C繼承了的標準庫 &#xff0c; 這就意味著 C 中 可以使用的標準庫函數 在C 中都可以使用 &#xff0c; 但是需要注意的是 &#xff0c; 這些標準庫函數在C中不再以 <xxx.h> 命名 &#xff0c; 而是變成了 <cxxx> 。 例如 &#xff1a; 在C中操作字符串的…

分享WCF聊天程序--WCFChat

無意中在一個國外的站點下到了一個利用WCF實現聊天的程序&#xff0c;作者是&#xff1a;Nikola Paljetak。研究了一下&#xff0c;自己做了測試和部分修改&#xff0c;感覺還不錯&#xff0c;分享給大家。先來看下運行效果&#xff1a;開啟服務&#xff1a;客戶端程序&#xf…

c# uri.host_C#| 具有示例的Uri.Equality()運算符

c# uri.hostUri.Equality()運算符 (Uri.Equality() Operator) Uri.Equality() Operator is overloaded which is used to compare two Uri objects. It returns true if two Uri objects contain the same Uri otherwise it returns false. Uri.Equality()運算符已重載&#xf…

第六章至第九章的單元測試

1,?助劑與纖維作用力大于纖維分子之間的作用力,則該助劑最好用作() 纖維增塑膨化劑。 2,助劑擴散速率快,優先占領纖維上的染座,但助劑與纖維之間作用力小于染料與纖維之間作用力,該助劑可以作為() 勻染劑。 3,助劑占領纖維上的染座,但助劑與纖維之間作用力大于染…

【神經網絡擴展】:斷點續訓和參數提取

課程來源&#xff1a;人工智能實踐:Tensorflow筆記2 文章目錄前言斷點續訓主要步驟參數提取主要步驟總結前言 本講目標:斷點續訓&#xff0c;存取最優模型&#xff1b;保存可訓練參數至文本 斷點續訓主要步驟 讀取模型&#xff1a; 先定義出存放模型的路徑和文件名&#xff0…

開發DBA(APPLICATION DBA)的重要性

開發DBA是干什么的&#xff1f; 1. 審核開發人員寫的SQL&#xff0c;并且糾正存在性能問題的SQL ---非常重要 2. 編寫復雜業務邏輯SQL&#xff0c;因為復雜業務邏輯SQL開發人員寫出的SQL基本上都是有性能問題的&#xff0c;與其讓開發人員寫&#xff0c;不如DBA自己寫。---非常…

javascript和var之間的區別?

You can define your variables in JavaScript using two keywords - the let keyword and the var keyword. The var keyword is the oldest way of defining and declaring variables in JavaScript whereas the let is fairly new and was introduced by ES15. 您可以使用兩…

小米手環6NFC安裝太空人表盤

以前看我室友峰哥、班長都有手環&#xff0c;一直想買個手環&#xff0c;不舍得&#xff0c;然后今年除夕的時候降價&#xff0c;一狠心&#xff0c;入手了&#xff0c;配上除夕的打年獸活動還有看春晚京東敲鼓領的紅包和這幾年攢下來的京東豆豆&#xff0c;原價279的小米手環6…

計算機二級c語言題庫縮印,計算機二級C語言上機題庫(可縮印做考試小抄資料)...

小抄,答案,形成性考核冊,形成性考核冊答案,參考答案,小抄資料,考試資料,考試筆記第一套1.程序填空程序通過定義學生結構體數組&#xff0c;存儲了若干個學生的學號、姓名和三門課的成績。函數fun 的功能是將存放學生數據的結構體數組&#xff0c;按照姓名的字典序(從小到大排序…

為什么兩層3*3卷積核效果比1層5*5卷積核效果要好?

目錄1、感受野2、2層3 * 3卷積與1層5 * 5卷積3、2層3 * 3卷積與1層5 * 5卷積的計算量比較4、2層3 * 3卷積與1層5 * 5卷積的非線性比較5、2層3 * 3卷積與1層5 * 5卷積的參數量比較1、感受野 感受野&#xff1a;卷積神經網絡各輸出特征像素點&#xff0c;在原始圖片映射區域大小。…

算法正確性和復雜度分析

算法正確性——循環不變式 算法復雜度的計算 方法一 代換法 —局部代換 這里直接對n變量進行代換 —替換成對數或者指數的情形 n 2^m —整體代換 這里直接對遞推項進行代換 —替換成內部遞推下標的形式 T(2^n) S(n) 方法二 遞歸樹法 —用實例說明 —分析每一層的內容 —除了…

第十五章 Python和Web

第十五章 Python和Web 本章討論Python Web編程的一些方面。 三個重要的主題&#xff1a;屏幕抓取、CGI和mod_python。 屏幕抓取 屏幕抓取是通過程序下載網頁并從中提取信息的過程。 下載數據并對其進行分析。 從Python Job Board&#xff08;http://python.org/jobs&#x…

array_chunk_PHP array_chunk()函數與示例

array_chunkPHP array_chunk()函數 (PHP array_chunk() Function) array_chunk() function is an array function, it is used to split a given array in number of array (chunks of arrays). array_chunk()函數是一個數組函數&#xff0c;用于將給定數組拆分為多個數組(數組…

raise

raise - Change a windows position in the stacking order button .b -text "Hi there!"pack [frame .f -background blue]pack [label .f.l1 -text "This is above"]pack .b -in .fpack [label .f.l2 -text "This is below"]raise .b轉載于:ht…