【循序漸進學Python】14.數據庫的支持

純文本只能夠實現一些簡單有限的功能。如果想要實現自動序列化,也可以使用 shelve 模塊和 pickle 模塊來實現。但是,如果想要自動的實現數據并發訪問,以及更標準,更通用的數據庫(database)存儲方式還是使用數據庫。

1. Python 數據庫 API

很多支持SQL標準的數據庫在Python中都有對應的客戶端模塊。為了在提供相同功能(基本相同)的不同模塊之間進行切換(兼容),Python 規定了一個標準的 DB API。目前API最新版本時 2.0,具體可以參考這里:http://www.python.org/dev/peps/pep-0249/。

1.1 全局變量

任何支持2.0版本的DB API的數據庫模塊都定義了3個描述模塊特性的全局變量:

apilevel            所使用的Python DB API版本
threadsafety        模塊的線程安全級別       
paramstyle          在SQL查詢中使用的參數風格

apilevel 是個字符串常量,提供正在使用API的版本號,對于DB API 2.0 版本來說

  • 值可能是 ‘1.0’,
  • 也可能是 ‘2.0’;

threadsafety 這這只有在使用多線程時才有參考價值,取值范圍為0~3的整數。

  • 0 表示完全不共享模塊
    • 1 表示線程本身可以共享模塊,但不對連接共享
  • 3 表示模塊完全是線程安全的

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

  • 'format'表示標準的字符串格式化
  • 'pyformat'表示擴展的格式代碼,使用字典拼接
  • 'qmark'表示使用問號
  • 'numberic'表示使用 :1 或 :2 格式的字段
  • 'named’表示使用 :name 格式的字段

1.2 異常

API中定義了(層次結構)一些異常類,可以通過 except 塊捕捉多種異常。如果想要知道更多DB API異常的想想可以參考這里:http://www.python.org/dev/peps/pep-0249/#exceptions,下面是DB API中使用的異常:

===============================================================================
異常                       超類               描述                             
===============================================================================
StandarError                                所有異常的泛型基類
Waring                  StandarError        在非致命錯誤發生時引發
Error                   StandarError        所有錯誤條件的泛型超類
InterfaceError          Error               關于接口而非數據庫的錯誤
DatabaseError           Error               與數據庫相關的錯誤的基類 
DataError               DatabaseError       與數據庫相關的問題,比如值超出范圍
OperationalError        DatabaseError       數據庫內部操作錯誤
IntegrityError          DatabaseError       關系完整性受到影響,比如鍵檢查失敗
InternalError           DatabaseError       數據庫內部錯誤,比如非法游標
ProgramningError        DatabaseError       用戶編程錯誤,比如未找到表
NotSupportedError       DatabaseError       請求不支持的特性(比如回滾)

1.3 連接和游標

使用 connect 函數連接到數據庫,該函數有多個參數,具體使用方法取決于對應的數據庫。下面是具體的參數含義(使用時推薦使用關鍵字參數的方式):

==================================================
參數名         描述                                 
==================================================
dsn         數據庫源名稱,給出參數表示數據庫依賴(必選)  
user        用戶名(可選)                           
passowrd    密碼(可選)                                     
host        主機名(可選)                                      
database    數據庫名(可選)                                    

函數返回連接對象,該對象表示目前和數據庫的會話,對象支持的方法如下:

=============================================================
方法名                 描述                                 
=============================================================
close()             關閉連接之后,連接對象和它的游標均不可用
commit()            如果支持的話就提交掛起事務,否則不可用
rollback()          回滾掛起的事務
cursor()            返回連接的游標對象

rollback 方法如果使用的數據庫支持的話,就會撤銷所有未提交的事務。而 cursor 方法則返回一個游標對象,可以通過游標執行SQL查詢并檢查結果。游標比連接支持更多方法,也更加易用,下面是游標方法的概述:

====================================================================================
名稱                                     描述                                 
====================================================================================
callproc(name[, params])            使用給定的名稱和參數(可選)調用以命名的數據庫程序
close()                             關閉游標后,游標不可用
execute(oper[, params])             執行SQL操作,可選的參數
executemany(oper, pseq)             對序列中的每個參數執行SQL操作
fetchone()                          把查詢結果集中的下一行保存為序列或者None
fetchmany([size])                   獲取查詢的結果集中的多行,默認尺寸為arraysize
fetchall()                          將所有(剩余)的行作為序列的序列
nextset()                           跳至下一個可用的結果集(可選)
setinputsizes(sizes)                為參數預先定義的內存區域
setoutputsize(size[, col])          為獲取的大數據庫值設定緩沖區尺寸

游標對象還包含一些特性:

==================================================
名稱                   描述                                 
==================================================
description         結果列描述的序列,只讀                       
rowcount            結果中的行數,只讀
arraysize           fetchmany中返回的行數,默認為1

1.4 類型

DB API 定義了Python中的類型和數據庫類型的對應關系。通過特殊的類型和值的構造函數以及常量(單例模式),如下(一些模塊可能并不是完全按照這些定義):

==================================================
名稱                                  描述                                 
==================================================
Date(year, month, day)              創建保存日期值的對象
Time(hour, minute, second)          創建保存時間值的對象
Timestamp(y, mon, d, h, min, s)     創建保存時間戳的對象
DateFromTicks(ticks)                創建保存自新紀元以來的秒數的對象
TimeFromTicks(ticks)                創建保存來自秒數的時間值的對象
TimestampFromTicks(ticks)           創建保存來自秒數的時間戳值的對象
Binary(string)                      創建保存二進制字符串值的對象
STRING                              描述二進制列(比如LONG或RAW)
BINARY                              描述數字列
MUMBER                              描述數字列
DATETIME                            描述日期/時間列
ROWID                               描述行ID列

2. SQLite 和PySQLite

SQLite是一個小型的數據庫引擎,它不基于集中式數據庫存儲機制,而是直接作用于本地文件。在Python 2.5 之后,SQLite 的包裝(PySQLite)已經被包含在標準庫中了(在最新的Python版本中已經包含了SQLite數據庫了,并不需要單獨安裝)。

2.1 簡單示例

將SQLite作為名為sqlite3的模塊導入,即可創建一個數據庫文件(不存在則創建,可指定路徑),并連接到數據庫,下面是一個簡單的示例:

# -- coding:utf-8 --
import sqlite3conn = sqlite3.connect('myDatabase.db')
curs = conn.cursor() # 獲得游標
conn.commit() # 提交更改
conn.close()  # 關閉連接

2.2 創建和填充表

通過下面的示例來學習如果創建和向表中插入數據,在這里使用的數據庫是基于USDA營養數據庫實驗室提供的文本格式的數據庫,在這里使用的文件地址是:http://sr23-nutrient-calculator.googlecode.com/svn-history/r9/trunk/ABBREV.txt,示例如下:

import sqlite3def 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 = r'INSERT INTO food VALUES(?,?,?,?,?,?,?,?,?,?)'for line in open('ABBREV.txt'):fields = line.split('^')vals = [convert(f) for f in fields[0:10]]curs.execute(query,vals)conn.commit()
conn.close()

2.3 搜索和處理結果

查詢數據庫內容只需要創建連接,并獲得該連接的游標即可,通過 execute 方法執行SQL查詢,使用 fetchall 等方法提取結果,如下所示:

# food_query.py
import sqlite3,sysconn = 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'% pairprint

運行程序,通過命令行傳遞查詢參數:

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

參考資料&進一步閱讀

Python Doc —— sqlite3

Python基礎教程

轉載于:https://www.cnblogs.com/IPrograming/p/Python-database.html

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

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

相關文章

Foundation框架

1.框架是由許多類、方法、函數、文檔按照一定的邏輯組織起來的集合&#xff0c;以便使研發程序變的更容易 清除緩存&#xff0c;刪除這個文件夾下的所有文件/Users/fanyafang/Library/Developer/Xcode/DerivedData 顯示隱藏文件&#xff1a;defaults write com.apple.finder Ap…

ubuntu上搭建php,ubuntu10.04上搭建php網站運行環境

ubuntu 10.04下搭建php網站運行環境ubuntu 10.04下搭建php網站運行環境前提&#xff1a;要打開root權限sudo password [這里填寫root密碼]1、第一步安裝ubuntu10.042、更新源sudo apt-get update3、安裝lighttpdsudo apt-get install lighttpd安裝好之后檢查lighttpd是否成功啟…

Windows 10 Threshold 2 升級記錄

昨天&#xff08;11月17日&#xff09;升級到Windows 10 Threshold 2版本。我的使用的設備是Surface Pro 3&#xff0c;4G內存&#xff0c;128G硬盤。 Threshold 2是作為一個Windows系統更新推送的。如果沒有收到系統更新提示&#xff0c;在系統設置里面手動檢查一下更新就可以…

轉換php script類型,javascript如何實現值的類型轉換

本篇文章給大家介紹使用javascript進行值的類型轉換的方法&#xff0c;有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對你們有所幫助。JavaScript是松散類型的語言&#xff0c;大多數情況下&#xff0c;運算符和函數會自動將值轉換為正確的類型(隱式轉…

iOS屏幕適配方案-Auto Layout

市場上的android手機五花八門。各種尺寸的屏幕讓android程序員們比較頭疼。也有一些大神寫了一些博客提出了自己的觀點。iOS貌似也迎來了大屏6&#xff0b;&#xff0c;因此屏幕適配的問題也是有滴&#xff0c;因此蘋果也有自己的方法&#xff0d;auto Layout 。本人初學iOS。今…

Exercise 12: Prompting People

age raw_input("How old are you? ") height raw_input("How tall are you? ") weight raw_input("How much do you weigh? ") print "So, youre %r old, %r tall and %r heavy." % ( age, height, weight) 轉載于:https://www.…

一年一循環

一年了&#xff0c;沒怎么關注博客園&#xff0c;回來看看。 希望自己今后多學多記錄多分享。轉載于:https://www.cnblogs.com/Chinarain/p/4974904.html

JAVA三角海倫公式,海倫公式求三角形面積出錯求教

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓就下面這個程序 輸入其他的數字都可以算出面積 但是當輸入3,4,6時 計算出面積為零 求吧友指出錯誤在哪package javaapplication17;import java.util.Scanner;public class JavaApplication17 {public static void main(String[] ar…

虛擬機里面安裝Openfiler 2.99

2019獨角獸企業重金招聘Python工程師標準>>> 簡介 Openfiler 由rPath Linux驅動&#xff0c;它是一個基于瀏覽器的免費網絡存儲管理實用程序&#xff0c;可以在單一框架中提供基于文件的網絡連接存儲 (NAS) 和基于塊的存儲區域網 (SAN)。Openfiler 支持 CIFS、NFS、…

win10如何搭建php,Win10系統怎么搭建php環境 win10搭建PHP環境方法

Win10系統怎么搭建php環境&#xff1f;win10搭建PHP環境方法。在今天的Win10系統使用教程中&#xff0c;我們將給大家分享的是在Win10系統下搭建Apache和PHP的開發環境的方法。可能有網友會問&#xff1a;Win10系統搭載Apache和PHP的開發環境的方法是不是與Win7/Win8.1的差不多…

關于jmf不能播放mp3的問題解決

想寫個JAVA的MP3音樂管理器&#xff0c;使用JMF插件&#xff0c;但發現運行時總報一個異常&#xff1a;Unable to handle format: mpeglayer3, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed, 16000.0 frame rate, FrameSize32768 bitsFailed to realize: com.sun.media.P…

LINK:fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞

原文地址&#xff1a;http://yacare.iteye.com/blog/2010049 很多伙伴在更新VS2010&#xff0c;或者卸載VS2012安裝2010后&#xff0c;建立Win32 Console Project/MFC項目時會出現"LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞"的錯誤。 錯誤描…

網站出現403 Forbidden

1&#xff0c; 你在一定時間內過多地訪問此網站&#xff08;一般是用采集程序&#xff09;&#xff0c;被防火墻拒絕訪問了 2&#xff0c; 網站域名解析到了空間&#xff0c;但空間未綁定此域名 3&#xff0c; 你的網頁腳本文件在當前目錄下沒有執行權限 4&#xff0c; 服務器繁…

matlab離散信號卷積和,信號與系統實驗(MATLAB版)實驗7離散信號的卷積和.ppt

一、實驗目的   1 熟悉離散時間信號卷積的定義、表示以及卷積的結果;    2 掌握利用計算機進行離散時間信號卷積運算的原理和方法;    3 熟悉離散時間信號的相關計算方法;    4 熟悉離散時間信號卷積運算函數conv和deconv的應用。   2. 卷積計算的幾何解法…

學Linux從編譯命令開始——arm-linux-gcc常用參數講解

1.想要編譯出ARM平臺上的代碼&#xff0c;需要四個步驟&#xff0c;預處理&#xff0c;編譯&#xff0c;匯編&#xff0c;鏈接。 arm-linux-gcc有諸多選項 arm-linux-gcc -o main main.c  不加-c、-S、-E等參數&#xff0c;則同時進行四個步驟&#xff0c;生成可執行文件。 其…

【轉】如何在編程生涯中有一個好的開端

本文來自&#xff1a;http://www.techug.com/how-get-jump-start-your 作者&#xff1a;http://www.techug.com/author/admin&#xff08;中文&#xff0c;譯作者&#xff09; 作者&#xff1a;http://java.dzone.com/users/simpleprogrammer&#xff08;英文&#xff0c;原作者…

git的使用1[轉]

在應用程序開發過程中&#xff0c;很重要的一部分工作就是如何進行源碼的版本控制。當代碼出現問題時&#xff0c;我們就需要將代碼恢復到原先正常的版本。如果是多個人共同開發一個項目&#xff0c;那么代碼的控制就會非常復雜。幸運的是&#xff0c;開發者不需要自己控制這些…

matlab做比例積分微分控制,收放卷卷徑計算+閉環擺桿控制參數自適應PID控制算法(變比例變積分變微分)介紹...

項目簡介最近在一個客戶現場搞熔邊機項目&#xff0c;涉及到收放卷工藝的卷徑計算&#xff0c;同時張力控制使用的是擺桿&#xff0c;然后通過PID控制輸出輔助轉速補償收卷伺服速度。單一的PID參數不能自動適應卷徑變化,如在小卷徑200mm下調試整定出的一組PID參數&#xff0c;當…

如何檢測支付寶接口中notify_url.php有沒有返回,支付寶中的手機網站支付接口,php版 notify_url.php 異步通知頁面未成功執行...

require_once("alipay.config.php");require_once("lib/alipay_notify.class.php");$alipayNotify new AlipayNotify($alipay_config);$verify_result $alipayNotify->verifyNotify();if($verify_result) {//驗證成功$notify_data $alipayNotify->…