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)
director_id = get_and_set_director(db, director)
cursor = db.cursor()
cursor.execute("INSERT INTO dvds ”
"(title, year, duration, director_id)"
"VALUES (?, ?, ?, ?)",
(title, year, duration, director_id))
db.commit()
这一函数的开始代码与dvds-dbm.py程序中的对应函数一样,但在完成数据的收集后,与原来的函数有很大的差别 。用户输入的发行者可能在也可能不在directors表格中,因此,我们有一个get_and_set_director()函数 , 在数据库中尚无某个发行者时, 该函数就将其插入到其中,无论哪种情况都返回就绪的发行者ID,以便在需要的时候插入到dvds表 。在所有数据都可用后,我们执行一条SQL INSERT语句 。我们不需要指定记录ID,因为SQLite会自动为我们提供 。
在査询中 , 我们使用问号(Python游标重置函数?)作为占位符,每个?都由包含SQL语句的字符串后面的序列中的值替代 。命名的占位符也可以使用,后面在编辑记录时我们将看到 。尽管避免使用占位符(而只是简单地使用嵌入到其中的数据来格式化SQL字符串)也是可能的,我们建议总是使用占位符,并将数据项正确编码与转义的工作留给数据库模块来完成 。使用占位符的另一个好处是可以提高安全性,因为这可以防止任意的SQL 被恶意地插入到一个査询中 。
def get_and_set_director(db, director):
director_id = get_director_id(db, director)
if directorjd is not None:
return director_id
cursor = db.cursor()
cursor.execute("lNSERT INTO directors (name) VALUES (?)”,(director,))
db.commit()
return get_director_id(db, director)
这一函数返回给定发行者的ID,并在必要的时候插入新的发行者记录 。如果某个记录被插入 , 我们首先尝试使用get_director_id()函数取回其ID 。
def get_director_id(db, director):
cursor = db.cursor()
cursor.execute("SELECT id FROM directors WHERE name=?",(director,))
fields = cursor.fetchone()
return fields[0] if fields is not None else None
get_director_id()函数返回给定发行者的ID,如果数据库中没有指定的发行者,就返回None 。我们使用fetchone()方法,因为或者有一个匹配的记录,或者没有 。(我们知道 , 不会有重复的发行者,因为directors表格的名称字段有一个UNIQUE约束,在任何情况下,在添加一个新的发行者之前,我们总是先检査其是否存在 。)这种取回方法总是返回一个字段序列(如果没有更多的记录,就返回None) 。即便如此,这里我们只是请求返回一个单独的字段 。
def edit_dvd(db):
title, identity = find_dvd(db, "edit")
if title is None:
return
title = Console.get_string("Title","title", title)
if not title:
return
cursor = db.cursor()
cursor.execute("SELECT dvds.year, dvds.duration, directors.name"
“FROM dvds, directors "
"WHERE dvds.director_id = directors.id AND "
"dvds.id=:id", dict(id=identity))
year, duration, director = cursor.fetchone()
director = Console.get_string("Director", "director", director)
if not director:
return
year = Console,get_integer("Year","year", year, 1896,datetime.date.today().year)
duration = Console.get_integer("Duration (minutes)", "minutes",
duration, minimum=0, maximum=60*48)
director_id = get_and_set_director(db, director)
- mysql游标和存储过程是什么 mysql游标表名为变量
- mysql重置数据库 重配mysql的编码
- mysql 游标遍历 mysql游标取多变量
- mysql重置 mysql重建服务
- mongodb数据库位置 mongodb数据库游标
- mongdb python pythonmongodb操作
- mongodb分组查询 mongodb分组重置
- redis重新设置值,过期时间会变吗 redis 重置key
- 简述在mysql中使用游标的具体步骤 mysql怎样申明游标
- 如何对云服务器进行环境重置? 云服务器环境怎么重置
