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与shell的3种交互方式介绍
Apr 11 Python
Python修改MP3文件的方法
Jun 15 Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
python对于requests的封装方法详解
Jan 03 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
Jun 15 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
Python 里最强的地图绘制神器
Mar 01 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 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 实例化类的一点摘记
2008/03/23 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
js中indexof的用法详细解析
2013/12/24 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
python获取外网ip地址的方法总结
2015/07/02 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
CSS3 简写animation
2012/05/10 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
文员个人求职自荐信
2013/09/21 职场文书
触电现场处置方案
2014/05/14 职场文书
公司应聘求职信
2014/06/21 职场文书
大学生学年个人总结
2015/02/15 职场文书
老兵退伍感言
2015/08/03 职场文书
Python正则表达式中flags参数的实例详解
2022/04/01 Python
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python
方法汇总:Python 安装第三方库常用
2022/04/26 Python