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 相关文章推荐
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
Scrapy框架使用的基本知识
Oct 21 Python
Python3.8中使用f-strings调试
May 22 Python
Django框架自定义session处理操作示例
May 27 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
python3实现mysql导出excel的方法
Jul 31 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Python3实现打印任意宽度的菱形代码
Apr 12 Python
利用Opencv实现图片的油画特效实例
Feb 28 Python
Django框架中模型的用法
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
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
nodejs基础应用
2017/02/03 NodeJs
javascript流程控制语句集合
2017/09/18 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
Python守护线程用法实例
2017/06/23 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Sanic框架路由用法实例分析
2018/07/16 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
django认证系统 Authentication使用详解
2019/07/22 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
Python中SQLite如何使用
2020/05/27 Python
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
中专毕业生自荐信
2013/11/16 职场文书
师范大学毕业自我鉴定
2013/11/21 职场文书
音乐教学随笔感言
2014/02/19 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js