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多线程threading.Lock锁用法实例
Nov 01 Python
Python判断字符串与大小写转换
Jun 08 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
Django实现分页功能
Jul 02 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
Python实现分段线性插值
Dec 17 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
Django框架模型简单介绍与使用分析
Jul 18 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
django和vue实现数据交互的方法
Aug 21 Python
Django之form组件自动校验数据实现
Jan 14 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 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&&mysql)三
2006/10/09 PHP
解析php中反射的应用
2013/06/18 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
PHP数组实例详解
2016/06/26 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
JS实现滑动插件
2020/01/15 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
如何运行Python程序的方法
2013/04/21 Python
详解Python文本操作相关模块
2017/06/22 Python
Python的UTC时间转换讲解
2019/02/26 Python
python系列 文件操作的代码
2019/10/06 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
韩国11街:11STREET
2018/03/27 全球购物
战友聚会邀请函
2014/01/18 职场文书
违反学校规定检讨书
2014/01/18 职场文书
《逃家小兔》教学反思
2014/02/23 职场文书
消防宣传口号
2014/06/16 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
爱心捐书倡议书
2015/04/27 职场文书
导游词之西安骊山
2019/12/03 职场文书
python数字转对应中文的方法总结
2021/08/02 Python
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript