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记录详细调用堆栈日志的方法
May 05 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
基于python绘制科赫雪花
Jun 22 Python
Python3字符串encode与decode的讲解
Apr 02 Python
pandas中的series数据类型详解
Jul 06 Python
python变量的存储原理详解
Jul 10 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
Python 实现将某一列设置为str类型
Jul 14 Python
python破解同事的压缩包密码
Oct 14 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 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
截获网站title标签之家内容的例子
2006/10/09 PHP
php桌面中心(四) 数据显示
2007/03/11 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
Python数据结构之翻转链表
2017/02/25 Python
python绘制简单彩虹图
2018/11/19 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
实习教师个人的自我评价
2013/11/08 职场文书
成功的酒店创业计划书
2013/12/27 职场文书
单位消防安全制度
2014/01/12 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis