Python Cookbook-7.8 使用 Berkeley DB 數據庫

任務

你想將一些數據做持久化處理,而且也想體驗一下BerkeleyDB數據庫的簡潔和高效。

解決方案

如果以前在你的計算機中安裝過 BerkeleyDB,Python標準庫附帶的bsddb包(以及可選的 bsddb3,用于訪間Berkeley DBrelease 3.2數據庫)可以被用來作為 Berkeley DB接口。為了得到 bsddb 或者 bsddb3,如果沒有bsddb 的話,應當在 import 聲明的時候使用 try/exception:

try:from bsddb import db#先試試release 4
except ImportError:from bsddb3 import db#沒有,再試試release 3
print db.DB_VERSION_STRING
#輸出,示例:sleepycat Software:Berkeley DB 4.1.25:(December 19,2002)

為了創建一個數據庫,我們要初始化一個 db.DB 對象,然后向它的 open方法傳入適當的參數并調用之,如下:

adb = db.DB()
adb.open('db_filename', dbtype = db.DB_HASH, flags = db.DB_CREATE)

當你想創建一個數據庫時,db.DB_HASH 是幾種可以選擇的訪問方法中的一種,一個很常見的選擇是 db.DB_BTREE,使用 B+樹訪問(如果你想以排序的方式獲取記錄,這很方便)。也可以選擇構建一個內存數據庫,不使用任何持久化文件,只要將None作為文件名和第一個參數傳遞給 open 方法即可。

一旦有了一個打開的 db.DB 實例,你就可以添加記錄了。每條記錄由兩個字符串構成鍵和數據:

for i,w in enumerate('some words for example'.split( )):adb.put(w,str(i))

可以通過數據庫的游標訪問記錄:

def irecords(curs):record = curs.first()while record:yield recordrecord = curs.next()
for key,data in irecords(adb.cursor()):print 'key = %r,data = %r' %(key,data)
#輸出(the order may vary):
# key = 'some', data = '0'
# key = 'example', data = '3'
# key = 'words', data = '1'
# key = 'for', data = '2'

做完之后,需要關閉數據庫:

adb.close()

以后,在同一個或其他的Python程序中,可以給新創建的db.DB 實例的open 方法傳遞同樣的文件名,再次打開該數據庫:

the_same_db = db.DB()
the_same_db.open('db_filename')

然后用同樣的方式繼續工作:

the_same_db.put('skidoo',23')#添加一條記錄
the_same_db.put('words','sweet')#替換一條記錄
for key,data in irecords(the_same_db.cursor()):print 'key=%r,data=%r'%(key,data)
#輸出(the order may vary):
# key='some',data='0'
# key='example',data='3'
# key='words',data='sweet'
# key='for',data='2'
# key='skidoo',data='23'

再次提醒,在所有操作結束之后不要忘記關閉數據庫:

the_same_db.close()

討論

Berkeley DB 是一個流行的開源數據庫。它不支持SQL,但卻很容易使用,并提供了優異的性能,如果你希望掌控全局的話,它給了你充分的自由來控制所發生的一切,可以通過大量的選項、標志以及方法來完成控制。除了Python,我們也可以通過其他語言來訪問 Berkeley DB:比如,可以用 Python 程序完成一些修改和查詢,然后再使用一個獨立的C程序,使用相同的基本開源庫(可以從Sleepycat 下載),對同樣的數據庫做同樣的事情。

Python 標準庫模塊shelve 可以使用 Berkeley DB 作為它的數據庫引擎,就像它使用cPickle 進行序列化操作一樣。然而,如果記錄都是由 pickle.dumps 產生的串,而這些串對于除 Python 之外的任何語言來說都是很難處理的數據,那你將無法用其他語言訪問Berkeley DB數據庫文件。通過bsddb直接訪問 Berkeley DB,數據庫引擎能夠提供很多高級的功能,而這些都是 shelve無法提供的。

數據庫還是 pickle,或者兩者都用?
pickle 和 marshal,以及數據庫系統如 Berkeley DB 或關系型數據庫,它們的應用場合有很大不同,但是仍然有一些重疊的地方
pickle(以及 marshal)本質上是序列化處理:將Python 對象轉變成可以傳輸或者儲存的 BLOB,之后可以由另一方接收或者恢復。序列化的數據是被用來重建Pythor對象的,基本上也只能被 Python 應用程序訪問。而針對對象或對象的一部分的搜索和選擇操作,pickle 不能提供任何支持
數據庫(Berkeley DB,關系型數據庫,以及其他類型)本質上是以數據為核心的:可以保存或者獲取成組的基本類型的數據(大多是字符串和數字),還能夠得到很多有關選取和搜索(對于關系型數據,這種支持可以說是海量的)以及跨語言的支持。數據庫對于將 Python 對象序列化成數據或者從數據中反序列化出Python 對象一無所知。
數據庫和序列化這兩種方式也可以被混用。可以用 pickle 將 Python 對象序列化成字節碼,然后用數據庫儲存,或者反過來。但 Python 標準庫 shelve 模塊只是在一個很底層的層面工作,比如,它可以借助 pickle 來完成序列化和反序列化,或使用bsddb來作為底層的數據庫引擎。因此,不要認為兩種方式是一種“競爭的”關系——而應該認為兩者是一種互相補充的關系。

舉個例子,如解決方案中的代碼所示,創建一個帶有db.DB_HASH 訪間方式的數據庫我們可以獲得最大的效率,不過,你可能也注意到了,用生成器irecords 列出所有的記錄時,哈希算法使得記錄以一種隨機的和無法預測的順序排列。如果你想以一種排序的方式訪問記錄,應該使用 db.DB_BTREE方法。BerkeleyDB支持很多高級功能,如事務,可以直接訪問數據庫來獲得這種功能,而不是試圖通過anydbm 或者shelve 來訪問。

更多的關于 Python 標準庫 bsddb 包的詳細文檔,請參看 http://pybsddb.sourceforge.netbsddb3.html。而關于BerkeleyDB本身的文檔、下載以及其他資料,請訪問http://www.sleepycat.com。

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

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

相關文章

QT6 源(82):閱讀與注釋日歷類型 QCalendar,本類并未完結,儒略歷,格里高利歷原來就是公歷,

&#xff08;1&#xff09;本代碼來自于頭文件 qcalendar . h &#xff1a; #ifndef QCALENDAR_H #define QCALENDAR_H#include <limits>#include <QtCore/qglobal.h> #include <QtCore/qlocale.h> #include <QtCore/qstring.h> #include <QtCore/…

【C/C++】字符函數和字符串函數

文章目錄 前言字符函數和字符串函數1.字符分類函數2.字符轉換函數3.strlen的使用和模擬實現3.1 代碼演示3.2 strlen返回值3.3 strlen的模擬實現 4.strcpy的使用和模擬實現4.1 代碼演示4.2 模擬實現 5.strcat的使用和模擬實現5.1 代碼演示5.2 模擬實現 6.strcmp的使用和模擬實現…

Spark-core-RDD入門

RDD基本概念 Resilient Distributed Dataset 叫做彈性分布式數據集&#xff0c;是Spark中最基本的數據抽象&#xff0c;是分布式計算的實現載體&#xff0c;代表一個不可變&#xff0c;可分區&#xff0c;里面的元素并行計算的集合。 - Dataset&#xff1a; 一個數據集合&…

緩存套餐-01.Spring Cache介紹和常用注解

一.Spring Cache 要使用直接導入坐標即可。 如何選擇底層的緩存實現呢&#xff1f;只要導入對應的緩存坐標即可。如果要使用redis作為緩存實現&#xff0c;那么只需要導入redis的maven坐標。 二.常用注解 Cacheable&#xff1a;不光往緩存中寫緩存數據&#xff0c;而且會從緩…

STM32智能空氣凈化器項目開發

一、項目概述 本空氣凈化器項目基于STM32F4系列微控制器&#xff0c;整合多傳感器數據采集、環境參數顯示、網絡通信及執行機構控制等功能&#xff0c;實現智能化空氣質量管理。項目采用FreeRTOS實時操作系統進行多任務調度&#xff0c;結合TFT觸摸屏實現人機交互&#xff0c;…

[數據處理] 6. 數據可視化

&#x1f44b; 你好&#xff01;這里有實用干貨與深度分享?? 若有幫助&#xff0c;歡迎&#xff1a;? &#x1f44d; 點贊 | ? 收藏 | &#x1f4ac; 評論 | ? 關注 &#xff0c;解鎖更多精彩&#xff01;? &#x1f4c1; 收藏專欄即可第一時間獲取最新推送&#x1f514;…

嵌入式學習筆記 - STM32 SRAM控制器FSMC

一 SRAM控制器內部結構圖&#xff1a; 以下以512K SRAM芯片為例 二 SRAM地址矩陣/尋址方式&#xff1a; SRAM的地址尋址方式通過行地址與列地址交互的方式存儲數據 三 STM32 地址映射 從STM32的地址映射中可以看出&#xff0c;FSMC控制器支持擴展4塊外部存儲器區域&#xff0…

python基礎:序列和索引-->Python的特殊屬性

一.序列和索引 1.1 用索引檢索字符串中的元素 # 正向遞增 shelloworld for i in range (0,len(s)):# i是索引print(i,s[i],end\t\t) print(\n--------------------------) # 反向遞減 for i in range (-10,0):print(i,s[i],end\t\t)print(\n--------------------------) print(…

phpstudy升級新版apache

1.首先下載要升級到的apache版本&#xff0c;這里apache版本為Apache 2.4.63-250207 Win64下載地址&#xff1a;Apache VS17 binaries and modules download 2.將phpstudy中原始apache復制備份Apache2.4.39_origin 3.將1中下載apache解壓&#xff0c; 將Apache24復制一份到ph…

開源業務流程:jBPM

一、什么是 jBPM&#xff1f; jBPM 是一個靈活的業務流程管理 (BPM) 套件。它不僅僅是一個流程引擎&#xff0c;而是一個集成了多種功能的平臺&#xff0c;旨在幫助企業建模、自動化和監控業務流程。jBPM 遵循業界標準&#xff0c;特別是 BPMN 2.0&#xff08;業務流程模型和標…

JAVA:使用 JMH 進行基準測試的技術指南

1、簡述 在性能優化中,寫高效代碼離不開準確的基準測試。而 Java 的 JIT 編譯器會對代碼進行優化(如方法內聯、死代碼消除等),導致簡單的測試方法可能得不到真實的性能數據。這時候,JMH(Java Microbenchmark Harness)就派上用場了。 JMH 是 Java 官方提供的基準測試框…

Thinkphp開發自適應職業學生證書查詢系統職業資格等級會員證書管理網站

環境&#xff1a;php7.2mysql5.7think偽靜態 1.上傳壓縮包到服務器解壓 2.還原數據庫 3.配置數據庫信息application/database.php 4.后臺&#xff1a;http://你的域名/abc.php 用戶&#xff1a;admin 密碼&#xff1a;123456 程序說明&#xff1a; 【修復版】Thinkphp5開發的自…

(二)毛子整潔架構(CQRS/Dapper/領域事件處理器/垂直切片)

文章目錄 項目地址一、Application 層1.1 定義CQRS的接口以及其他服務1. Command2. IQuery查詢3. 當前時間服務接口4. 郵件發送服務接口 1.2 ReserveBooking Command1. 處理傳入的參數2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 Query使用Sql查詢1. 創…

詳解Redis

一.Redis的基本概念 首先&#xff0c;什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、高性能的鍵值對內存數據庫&#xff0c;常被用作緩存、消息隊列、分布式鎖等。 二.Redis的基本數據類型 1. 字符串&#xff08;String&am…

智慧醫院的可視化變革:可視化工具助力數字化轉型

在科技飛速發展的當下&#xff0c;智慧醫院已從概念逐步落地&#xff0c;深刻改變著傳統醫療模式。它借助互聯網、數字孿生及人工智能等前沿技術&#xff0c;在醫療服務領域掀起革新&#xff0c;涵蓋面向醫務人員的“智慧醫療”、面向患者的“智慧服務”以及面向醫院的“智慧管…

Ubuntu Linux系統配置賬號無密碼sudo

在Linux系統中&#xff0c;配置無密碼sudo可以通過修改sudoers文件來實現。以下是具體的配置步驟 一、編輯sudoers文件 輸入sudo visudo命令來編輯sudo的配置文件。visudo是一個專門用于編輯sudoers文件的命令&#xff0c;它會在保存前檢查語法錯誤&#xff0c;從而防止可能的…

graphviz和dot繪制流程圖

graphviz和dot繪制流程圖 指令 1.寫后端需求文檔 2.用中文輸出結果 3.必須詳細全面 4.必須搭配相關流程圖step1:下載graphviz&#xff0c;https://graphviz.org/download/ step2&#xff1a;安裝&#xff0c;記得添加環境變量 step3&#xff1a;驗證是否安裝成功 dot --versio…

MongoDB常用操作示例

以下是基于 MongoDB Shell 的完整操作示例&#xff0c;覆蓋數據庫管理、集合操作、文檔處理、聚合分析、索引管理等核心功能&#xff0c;并結合實際場景說明。所有示例均結合搜索結果中的技術要點整理而成。 一、連接與配置管理 1. 啟動 MongoDB Shell 并連接實例 # 默認連接…

C++ 模板方法模式詳解與實例

模板方法模式概念? 模板方法模式(Template Method Pattern)屬于行為型設計模式,其核心思想是在一個抽象類中定義一個算法的骨架,而將一些步驟延遲到子類中實現。這樣可以使得子類在不改變算法結構的情況下,重新定義算法中的某些步驟。它通過繼承機制,實現代碼復用和行為…

MySQL基礎關鍵_012_事務

目 錄 一、概述 二、ACID 四大特性 三、MySQL 事務 四、事務隔離級別 1.說明 2.現象 &#xff08;1&#xff09;臟讀 &#xff08;2&#xff09;不可重復讀 &#xff08;3&#xff09;幻讀 3.查看隔離級別 4.設置隔離級別 5.隔離級別 &#xff08;1&#xff09;初始…