cursor.execute("SELECT title, id FROM dvds "
"WHERE title LIKE ? ORDER BY title”,
(start +"%",))
records = cursor.fetchall()
if len(records) == 0:
print("There are no dvds starting with", start)
continue
elif len(records) == 1:
return records[0]
elif len(records)DISPLAY_LIMIT:
print("Too many dvds ({0}) start with {1}; try entering "
"more of the title".format(len(records),start))
continue
else:
for i, record in enumerate(records):
print("{0}:{1}".format(i + 1, record[0]))
which = Console.get_integer("Number (or 0 to cancel)",
"number", minimum=1, maximum=len(records))
return records[which -1] if which != 0 else (None, None)
这一函数的功能与dvdsdbm.py程序中的find_dvd()函数相同 , 并返回一个二元组 (DVD标题,DVD ID)或(None, None),具体依赖于是否找到了某个记录 。这里并不需要在所有数据上进行迭代,而是使用SQL通配符(%),因此只取回相关的记录 。
由于我们希望匹配的记录数较?。?因此我们一次性将其都取回到序列的序列中 。如果有不止一个匹配的记录,但数量上又少到可以显示 , 我们就打印记录,并将每条记录附带一个数字编号 , 以便用户可以选择需要的记录,其方式与在dvds-dbm.py程序中所做的类似:
def list_dvds(db):
cursor = db.cursor()
sql = ("SELECT dvds.title, dvds.year, dvds.duration, "
"directors.name FROM dvds, directors "
"WHERE dvds.director_id = directors.id")
start = None
if dvd_count(db)DISPLAY_LIMIT:
start = Console.get_string("List those starting with [Enter=all]", "start")
sql += " AND dvds.title LIKE ?"
sql += ” ORDER BY dvds.title"
print()
if start is None:
cursor.execute(sql)
else:
cursor.execute(sql, (start +"%",))
for record in cursor:
print("{0[0]} ({0[1]}) {0[2]} minutes, by {0[3]}".format(record))
要列出每个DVD的详细资料,我们执行一个SELECT査询 。该査询连接两个表 , 如果记录(由dvd_count()函数返回)数量超过了显示限制值,就将第2个元素添加到WHERE 分支,之后执行该査询,并在结果上进行迭代 。每个记录都是一个序列,其字段是与 SELECT査询相匹配的 。
def dvd_count(db):
cursor = db.cursor()
cursor.execute("SELECT COUNT(*) FROM dvds")
return cursor.fetchone()[0]
我们将这几行代码放置在一个单独的函数中 , 因为我们在几个不同的函数中都需要使用这几行代码 。
我们忽略了 list_directors()函数的代码,因为该函数在结构上与list_dvds()函数非常类似,只不过更简单一些 , 因为本函数只列出一个字段(name) 。
def remove_dvd(db):
title, identity = find_dvd(db, "remove")
if title is None:
return
ans = Console.get_bool("Remove {0}?".format(title), "no")
if ans:
cursor = db.cursor()
cursor.execute("DELETE FROM dvds WHERE id=?", (identity,))
db.commit()
在用户需要删除一个记录时 , 将调用本函数,并且本函数与dvds-dbm.py程序中 相应的函数是非常类似的 。
到此,我们完全查阅了 dvds-sql.py程序 , 并且了解了如何创建数据库表格、选取 记录、在选定的记录上进行迭代以及插入、更新与删除记录 。使用execute()方法 , 我们可以执行底层数据库所支持的任意SQL语句 。
SQLite提供了比我们这里使用的多得多的功能,包括自动提交模式(以及任意其他类型的事务控制) , 以及创建可以在SQL查询内执行的函数的能力 。提供一个工厂函数并用于控制对每个取回的记录返回什么(比如,一个字典或自定义类型 , 而不是字段序列)也是可能的 。此外,通过传递“:memory:”作为文件名,创建内存中的SQLite 数据库也是可能的 。
推荐阅读
- 鸿蒙os2.2测评,鸿蒙os23
- jdbc连接oracle写法,jdbc连接oracle代码
- 网络游戏刷金币赚钱,网络游戏刷金币赚钱软件
- 直播为什么那么费电量,看直播为什么费电
- htm如果获取php数据 html如何获取php中的变量
- 如何给mysql备份吗,Mysql实时异地备份
- 武汉网站开发智力,武汉网站建设有哪些
- 如何把几张pdf拼到一张,怎么把几张pdf放到一起
- 包含徐州容易上手家纺erp系统的词条