Python3 shelve对象持久存储原理详解

作者:爱编程的小灰灰 时间:2022-06-30 13:43:39 

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来得到一个定制解决方案。

来源:https://www.cnblogs.com/liuhui0308/p/12513321.html

标签:Python,3,shelve,对象
0
投稿

猜你喜欢

  • Python数据结构之优先级队列queue用法详解

    2023-03-10 03:37:40
  • 通过T_sql语句向其中一次填入一条数据或一次填入多条数据的方式填充数据

    2012-11-30 19:55:34
  • ORACLE 自动提交问题

    2023-07-24 10:43:13
  • css样式表滤镜全接触

    2007-10-26 12:48:00
  • Golang数据类型比较详解

    2023-07-17 10:11:21
  • 关于python线程池的四种实现方式

    2023-08-23 06:52:30
  • 在php7中MongoDB实现模糊查询的方法详解

    2023-09-04 12:30:00
  • 利用SQL语言有没有办法查到表中哪些记录中的全部

    2009-04-10 18:29:00
  • 使用Termux在手机上运行Python的详细过程

    2021-10-26 10:23:52
  • Python Numpy 数组的初始化和基本操作

    2022-08-28 22:18:23
  • Pandas.DataFrame删除指定行和列(drop)的实现

    2022-05-27 16:15:55
  • oracle 合并查询 事务 sql函数小知识学习

    2023-07-13 15:07:28
  • python自动登录12306并自动点击验证码完成登录的实现源代码

    2021-07-08 12:50:29
  • SQL Server 2008 到底需要使用哪些端口?

    2012-11-30 20:29:41
  • Oracle RMAN快速入门指南

    2010-07-18 12:50:00
  • Python使用post及get方式提交数据的实例

    2023-06-25 05:52:35
  • DNS优化的原理和方法

    2012-04-26 16:43:56
  • Symfony模板的快捷变量用法实例

    2023-11-15 04:43:24
  • asp无组件实现画简单图形的类

    2004-06-17 13:30:00
  • 大家都对vertical-align的各说各话

    2008-06-19 12:11:00
  • asp之家 网络编程 m.aspxhome.com