matches.append(title)
if len(matches) == 0:
print("There are no dvds starting with", start)
continue
elif len(matches) == 1:
return matches[0]
elif len(matches)DISPLAY_LIMIT:
print("Too many dvds start with {0}; try entering more of the title".format(start)
continue
else:
matches = sorted(matches, key=str.lower)
for i, match in enumerate(matches):
print("{0}: {1}".format(i+1, match))
which = Console.get_integer("Number (or 0 to cancel)",
"number", minimum=1, maximum=len(matches))
return matches[which - 1] if which != 0 else None
为尽可能快而容易地发现某个DVD,我们需要用户只输入其标题的一个或头几个字符 。在具备了标题的起始字符后 , 我们在DBM中迭代并创建一个匹配列表 。如果只有一个匹配项,就返回该项;如果有几个匹配项(但少于DISPLAY_LIMIT, 一个在程序中其他地方设置的整数),就以大小写不敏感的顺序展示所有这些匹配项,并为每一项设置一个编号,以便用户可以只输入编号就可以选择某个标题 。(Console.get_integer()函数可以接受0,即便最小值大于0,以便0可以用作一个删除值 。通过使用参数allow_zero=False, 可以禁止这种行为 。我们不能使用Enter键,也就是说,没有什么意味着取消,因为什么也不输入意味着接受默认值 。)
def list_dvds(db):
start =”"
if len(db) DISPLAY.LIMIT:
start = Console.get_string(“List those starting with [Enter=all]”,"start”)
print()
for title in sorted(db, key=str.lower):
if not start or title.Iower().startswith(start.lower()):
director, year, duration = db[title]
print("{title} ({year}) {duration} minute{0}, by "
"{director}".format(Util.s(duration),**locals()))
列出所有DVD (或者那些标题以某个子字符串引导)就是对DBM的所有项进行迭代 。
Util.s()函数就是简单的s = lambda x: "" if x == 1 else "s",因此 , 如果时间长度不是1分钟,就返回"s" 。
def remove_dvd(db):
title = find_dvd(db, "remove")
if title is None:
return
ans = Console.get_bool("Remove {0}?".format(title), "no")
if ans:
del db[title]
db.sync()
要移除一个DVD,首先需要找到用户要移除的DVD,并请求确认,获取后从DBM中删除该项即可 。
到这里,我们展示了如何使用shelve模块打开(或创建)一个DBM文件,以及如何向其中添加项、编辑项、对其项进行迭代以及移除某个项 。
遗憾的是,在我们的数据设计中存在一个瑕疵 。发行者名称是重复的,这很容易导致不一致性,比如,发行者Danny DeVito可能被输入为"Danny De Vito",用于 一个电影;也可以输入为“Danny deVito",用于另一个 。为解决这一问题,可以使用两个DBM文件,主DVD文件使用标题键与(年份 , 时间长度,发行者ID)值; 发行者文件使用发行者ID (整数)键与发行者名称值 。下一节展示的SQL数据库 版程序将避免这一瑕疵,这是通过使用两个表格实现的,一个用于DVD,另一个用于发行者 。
12.2 SQL数据库
大多数流行的SQL数据库的接口在第三方模块中是可用的,Python带有sqlite3 模块(以及SQLite 3数据库) , 因此,在Python中,可以直接开始数据库程序设计 。SQLite是一个轻量级的SQL数据库,缺少很多诸如PostgreSQL这种数据库的功能 , 但非常便于构造原型系统 , 并且在很多情况下也是够用的 。
为使后台数据库之间的切换尽可能容易 , PEP 249 (Python Database API Specification v2.0)提供了称为DB-API 2.0的API规范 。数据库接口应该遵循这一规范 , 比如sqlite3模块就遵循这一规范,但不是所有第三方模块都遵循 。API规范中指定了两种主要的对象,即连接对象与游标对象 。表12-1与表12-2中分别列出了这两种对象必须支持的API 。在sqlite3模块中,除DB-API 2.0规范必需的之外,其连接对象与游标对象都提供了很多附加的属性与方法 。
推荐阅读
- 鸿蒙os2.2测评,鸿蒙os23
- jdbc连接oracle写法,jdbc连接oracle代码
- 网络游戏刷金币赚钱,网络游戏刷金币赚钱软件
- 直播为什么那么费电量,看直播为什么费电
- htm如果获取php数据 html如何获取php中的变量
- 如何给mysql备份吗,Mysql实时异地备份
- 武汉网站开发智力,武汉网站建设有哪些
- 如何把几张pdf拼到一张,怎么把几张pdf放到一起
- 包含徐州容易上手家纺erp系统的词条