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实现的简单FTP上传下载文件实例
Jun 30 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
Python字符串的一些操作方法总结
Jun 10 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
Python发送邮件的实例代码讲解
Oct 16 Python
Python 切分数组实例解析
Nov 07 Python
django框架cookie和session用法实例详解
Dec 10 Python
Python 日期与时间转换的方法
Aug 01 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
javascript学习之闭包分析
2010/12/02 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
MySQL最常见的操作语句小结
2015/05/07 Python
python获取一组汉字拼音首字母的方法
2015/07/01 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
python添加菜单图文讲解
2019/06/04 Python
Python 画出来六维图
2019/07/26 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
毕业生欢送会主持词
2014/03/31 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
市场营销毕业求职信
2014/08/07 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书