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 24 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
python requests 测试代理ip是否生效
Jul 25 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
解析Python的缩进规则的使用
Jan 16 Python
python opencv实现图像边缘检测
Apr 29 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
Django的CVB实例详解
Feb 10 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
python使用布隆过滤器的实现示例
Aug 20 Python
基于Python实现一个春节倒计时脚本
Jan 22 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程序中的常见漏洞进行攻击
2006/10/09 PHP
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php数组去重实例及分析
2013/11/26 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
PHP时间函数使用详解
2019/03/21 PHP
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
python实现手机通讯录搜索功能
2018/02/22 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
学前教育专业毕业生自荐信
2013/10/03 职场文书
数控专业自荐书范文
2014/03/16 职场文书
三方股东合作协议书
2014/10/28 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
2016年教师节感言
2015/12/09 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL
Golang日志包的使用
2022/04/20 Golang
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android