如果可用的 DBM 与 SQLite 数据库不够充分,Python Package Index, pypi.python.org/pypi中提供了大量数据库相关的包,包括bsddb DBM ("Berkeley DB"),对象-关系映射器 , 比如SQLAlchemy (),以及流行的客户端/服务器数据的接口,比如 DB2、Informix、Ingres、MySQL、ODBC 以及 PostgreSQL 。
本章中,我们将实现某程序的两个版本 , 该程序用于维护一个DVD列表,并追踪每个DVD的标题、发行年份、时间长度以及发行者 。该程序的第一版使用DBM (通过shelve模块)存放其数据,第二版则使用SQLite数据库 。两个程序都可以加载与保存简单的XML格式 , 这使得从某个程序导出DVD数据并将其导入到其Python游标重置函数他程序成为可能 。与DBM版相比,基于SQL的程序提供了更多一些的功能,并且其数据设计也稍干净一些 。
12.1 DBM数据库
shelve模块为DBM提供了一个wrapper,借助于此,我们在与DBM交互时 , 可以将其看做一个字典,这里是假定我们只使用字符串键与picklable值 , 实际处理时,shelve模块会将键与值转换为bytes对象(或者反过来) 。
由于shelve模块使用的是底层的DBM,因此,如果其他计算机上没有同样的DBM,那么在某台计算机上保存的DBM文件在其他机器上无法读取是可能的 。为解决这一问题,常见的解决方案是对那些必须在机器之间可传输的文件提供XML导入与导出功能,这也是我们在本节的DVD程序dvds-dbm.py中所做的 。
对键 , 我们使用DVD的标题;对值 , 则使用元组 , 其中存放发行者、发行年份以及时间 。借助于shelve模块 , 我们不需要进行任何数据转换,并可以把DBM对象当做一个字典进行处理 。
程序在结构上类似于我们前面看到的那种菜单驱动型的程序,因此,这里主要展示的是与DBM程序设计相关的那部分 。下面给出的是程序main()函数中的一部分 , 忽略了其中菜单处理的部分代码 。
db = None
try:
db = shelve.open(filename, protocol=pickle.HIGHEST_PROTOCOL)
finally:
if db is not None:
db.dose()
这里我们已打开(如果不存在就创建)指定的DBM文件,以便于对其进行读写操作 。每一项的值使用指定的pickle协议保存为一个pickle,现有的项可以被读?。?即便是使用更底层的协议保存的,因为Python可以计算出用于读取pickle的正确协议 。最后,DBM被关闭——其作用是清除DBM的内部缓存 , 并确保磁盘文件可以反映出已作的任何改变,此外,文件也需要关闭 。
该程序提供了用于添加、编辑、列出、移除、导入、导出DVD数据的相应选项 。除添加外,我们将忽略大部分用户接口代码,同样是因为已经在其他上下文中进行了展示 。
def add_dvd(db):
title = Console.get_string("Title", "title")
if not title:
return
director = Console.get_string("Director", "director")
if not director:
return
year = Console.get_integer("Year", "year",minimum=1896,
maximum=datetime,date.today().year)
duration = Console.get_integer("Duration (minutes)", "minutes“, minimum=0, maximum=60*48)
db[title] = (director, year, duration)
db.sync()
像程序菜单调用的所有函数一样,这一函数也以DBM对象(db)作为其唯一参数 。该函数的大部分工作都是获取DVD的详细资料,在倒数第二行,我们将键-值项存储在DBM文件中,DVD的标题作为键,发行者、年份以及时间(由shelve模块pickled在一起)作为值 。
为与Python通常的一致性同步,DBM提供了与字典一样的API,因此,除了 shelve.open() 函数(前面已展示)与shelve.Shelf.sync()方法(该方法用于清除shelve的内部缓存,并对磁盘上文件的数据与所做的改变进行同步——这里就是添加一个新项),我们不需要学习任何新语法 。
推荐阅读
- 荣耀cpu是什么,荣耀的cpu是什么型号
- 平高gis故障,电气gis设备常见故障
- 链区块的应用,区块链的127种应用场景
- 网络运营直播教程,网络直播运营是做什么的
- php连接数据库例子 php连接数据库查询数据
- Go语言企业级教程,go 语言教程
- 往u盘里面下载音乐用什么下载,u盘下载音乐用什么软件
- 汽车挑战陡坡模拟游戏,汽车爬山坡的游戏
- java代码审计自动化 java 自动化测试平台