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转换摩斯密码示例
Feb 16 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
python编写简单爬虫资料汇总
Mar 22 Python
Django后台获取前端post上传的文件方法
May 28 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
pytorch梯度剪裁方式
Feb 04 Python
Python猜数字算法题详解
Mar 01 Python
python爬虫基础知识点整理
Jun 02 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 Python
常用的Python代码调试工具总结
Jun 23 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函数(简单整理)
2010/04/30 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
Python中__new__与__init__方法的区别详解
2015/05/04 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
竞职演讲稿范文
2014/01/11 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
消防工作实施方案
2014/06/09 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
2014年班组长工作总结
2014/11/20 职场文书
个人创业事迹材料
2014/12/30 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
详解MindSpore自定义模型损失函数
2021/06/30 Python
Javascript webpack动态import
2022/04/19 Javascript