Python3 shelve对象持久存储原理详解


Posted in Python onMarch 23, 2020

1.shelve对象的持久存储

不需要关系数据库时,可以用shelve模块作为持久存储Python对象的一个简单的选择。类似于字典,shelf按键访问。值将被pickled并写至由dbm创建和管理的数据库。

1.1 创建一个新shelf

使用shelve最简单的方法就是利用DbfilenameShelf类。它使用dbm存储数据。这个类可以直接使用,也可以通过调用shelve.open()来使用。

import shelve
with shelve.open('test_shelf.db') as s:
  s['key1'] = {
    'int': 10,
    'float': 9.5,
    'string': 'Sample data',
  }

再次访问这个数据,可以打开shelf,并像字典一样使用它。

import shelve
with shelve.open('test_shelf.db') as s:
  existing = s['key1']
print(existing)

运行这两个示例脚本会生成以下输出。

Python3 shelve对象持久存储原理详解

dbm模块不支持多个应用同时写同一个数据库,不过它支持并发的只读客户。如果一个客户没有修改shelf,则可以通过传入flag='r'来告诉shelve以只读方式打开数据库。

import dbm
import shelve
with shelve.open('test_shelf.db', flag='r') as s:
  print('Existing:', s['key1'])
  try:
    s['key1'] = 'new value'
  except dbm.error as err:
    print('ERROR: {}'.format(err))

如果数据库作为只读数据源打开,并且程序试图修改数据库,那么便会生成一个访问错误异常。具体的异常类型取决于创建数据库时dbm选择的数据库模块。

Python3 shelve对象持久存储原理详解

1.2 写回

默认的,shelf不会跟踪对可变对象的修改。这说明,如果存储在shelf中的一个元素的内容有变化,那么shelf必须再次存储整个元素来显式的更新。

import shelve
with shelve.open('test_shelf.db') as s:
  print(s['key1'])
  s['key1']['new_value'] = 'this was not here before'
with shelve.open('test_shelf.db', writeback=True) as s:
  print(s['key1'])

在这个例子中,没有再次存储'key1'的相应字典,所以重新打开shelf时,修改不会保留。

Python3 shelve对象持久存储原理详解

对于shelf中存储的可变对象,要想自动捕获对它们的修改,可以在打开shelf时启用写回(writeback)。writeback标志会让shelf使用内存中缓存以记住从数据库获取的所有对象。shelf关闭时每个缓存对象也被写回到数据库。

import shelve
import pprint
with shelve.open('test_shelf.db', writeback=True) as s:
  print('Initial data:')
  pprint.pprint(s['key1'])
  s['key1']['new_value'] = 'this was not here before'
  print('\nModified:')
  pprint.pprint(s['key1'])
with shelve.open('test_shelf.db', writeback=True) as s:
  print('\nPreserved:')
  pprint.pprint(s['key1'])

尽管这会减少程序员犯错的机会,并且使对象持久存储更透明,但是并非所有情况都有必要使用写回模式。打开shelf时缓存会消耗额外的内容,关闭shelf时会暂时将各个缓存对象写回到数据库,这会减慢应用的速度。所有缓存的对象都要写回数据库,因为无法区分它们是否有修改。如果应用读取的数据多于写的数据,那么写回就会影响性能而没有太大意义。

Python3 shelve对象持久存储原理详解

1.3 特定shelf类型

之前的例子都使用了默认的shelf实现。可以使用shelve.open()而不是直接使用某个shelf实现,这是一种常用的用法,特别是使用什么类型的数据库来存储数据并不重要时。不过,有些情况下数据库格式会很重要。在这些情况下,可以直接使用DbfilenameShelf或BsdDbshelf,或者甚至可以派生Shelf来得到一个定制解决方案。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
Jul 12 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
pandas dataframe添加表格框线输出的方法
Feb 08 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
django和vue实现数据交互的方法
Aug 21 Python
使用python实现学生信息管理系统
Feb 25 Python
详解python第三方库的安装、PyInstaller库、random库
Mar 03 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
May 26 Python
pytorch锁死在dataloader(训练时卡死)
May 28 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 Python
python新式类和经典类的区别实例分析
Mar 23 #Python
Python count函数使用方法实例解析
Mar 23 #Python
使用python实现飞机大战游戏
Mar 23 #Python
如何在Django中使用聚合的实现示例
Mar 23 #Python
python3注册全局热键的实现
Mar 22 #Python
浅谈Python线程的同步互斥与死锁
Mar 22 #Python
Django 项目布局方法(值得推荐)
Mar 22 #Python
You might like
php数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
jquery禁用右键示例
2014/04/28 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
Vue2.x中的Render函数详解
2017/05/30 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
一文让你彻底搞清楚javascript中的require、import与export
2017/09/24 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
以一段代码为实例快速入门Python2.7
2015/03/31 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
Saltstack快速入门简单汇总
2016/03/01 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
python实现Windows电脑定时关机
2018/06/20 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
英文简历中的自我评价用语
2013/12/09 职场文书
公司培训心得体会
2014/01/03 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
工会文体活动总结
2015/05/07 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
入门学习Go的基本语法
2021/07/07 Golang