Python 实战(8):心中有数

加了影片搜索的功能之后,就存在没有搜到任何影片的情况。现在的网页上,如果没有搜到,就是没有显示结果。这个不是很直观,最好能有个提示,说没有搜到任何影片。

要实现这个功能,就得知道每次搜索出来的影片信息共有多少条。web.py 对于数据库的功能并没有做很多封装,并不能很方便地通过我们取出的影片数据得到数量。因此,需要再增加一次数据库查询,得到影片的数量。

获取数量的 SQL 语句是:

SELECT COUNT(*) FROM 数据库 WHERE 查询条件;

web.py 提供了接口:

db.query('SQL语句')

用来获取数据库查询指定 SQL 语句的结果。

在查询 movies 的代码(class index 的 POST 方法)之后增加一行查询数量的代码:

data = web.input()
condition = r'TITLE LIKE "%' + data.title + r'%"'
movies = db.select('movie', where=condition)
count = db.query('SELECT COUNT(*) AS COUNT FROM movie WHERE ' + condition)[0]['COUNT']

AS COUNT 是给查询结果设的别名,为了便于从结果中取值。

注意 WHERE 后面需要留空格,不然会和条件语句连在一起。

[0] 表示从结果里取出第一条,事实上这个查询语句只有一条结果,就是符合条件的数据数量值。

['COUNT'] 则是用设定的别名得到此数值。

这一行代码其实包含了好几条语句,看不明白的话,可以把它分开来,并且 print 出每一个中间步骤的结果:

statement = 'SELECT COUNT(*) AS COUNT FROM movie WHERE ' + condition
result = db.query(statement)
data = result[0]
count = data['COUNT']

得到影片数量之后,有两种选择,一种是直接在代码中判断,如果数量为 0,就返回另一个没有无结果的页面。另一种是把数量也作为参数传递给模板,让模板在显示的时候进行处理。

这里我选择后一种方法。这样不用再额外增加一个模板页面,而且对于搜索到结果的情况,也可以把数量显示在页面上。

所以,在返回模板时增加一个参数:

return render.index(movies, count)

同时,在模板 index.html 里处理这个参数:

$def with (movies, count)

具体显示部分:

$if count > 0:
    <p>共 $count 部影片</p>
    <p>影片列表:</p>
    ...
$else:
    <p>啊咧,没能找到符合条件的影片</p>

现在去搜一个不存在的关键字试试看,已经可以有提示了。

因为默认首页、演员查询、导演查询都用了同一个模板,所以在几处都要做同样的修改,增加 count 值。

既然增加了搜索结果的数量显示,顺手也把该次搜索的关键字给显示出来好了。模板里再增加一个叫 key 的参数:

$def with (movies, count, key)

在影片数量后面加上关键字:

<p>
    共 $count 部影片
    $if key:
        与 $key 有关
</p>

搜索代码在调用模板时提供 key 参数:

return render.index(movies, count, data.title)

以及演员、导演两处:

return render.index(movies, count, cast_name)
return render.index(movies, count, director_name)

对于默认首页,不存在关键字,就传递 None:

return render.index(movies, count, None)

完成。

做个小小的优化,给 $key 增加两个标签:

与 <b><u>$key</u></b> 有关

这样关键字就被加粗和加下划线了。

留一个思考题:如何在页面上显示最近搜索的关键字。

(相关代码文件已更新 github 并上传在论坛的帖子里)

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2015-06-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

Mysql 8.0 更好的支持了 UUID

背景 UUID 是大家常用的,是一个 128bit 的字符串,例如: 12345678-1234-5678-1234-567812345678 UUID 是有版...

47711
来自专栏黑泽君的专栏

day37_Spring学习笔记_05_CRM_01

CRM : custom releation manager 客户关系管理系统,用于维护客户和公司之间关系。 我们要做的是:学校 和 大家 之间关系。

742
来自专栏逸鹏说道

SQL Server 使用全文索引进行页面搜索

全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类...

3215
来自专栏大内老A

创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]

在《基于T4的代码生成方式》中,我对T4模板的组成结构、语法,以及T4引擎的工作原理进行了大体的介绍,并且编写了一个T4模板实现了如何将一个XML转变成C#代码...

8158
来自专栏云计算教程系列

想熟悉PostgreSQL?这篇就够了

PostgreSQL是自由的对象-关系型数据库服务器,在灵活的BSD风格许可证下发行。它在其他开放源代码数据库系统和专有系统之外,为用户又提供了一种选择。 我们...

2242
来自专栏数据和云

深入剖析-关于分页语句的性能优化

分页语句是数据库开发和应用场景比较常见的需求,即按照特定的where条件进行过滤,然后在按照一个或者多个条件进行排序(如果不进行排序无法确执行时候无法返回相同的...

2849
来自专栏林欣哲

MySQL数据库开发规范知识点速查

数据库设计规范 命名规范 基本设计规范 索引设计规范 字段设计规范 SQL开发规范 操作行为规范 命名规范 对象名称使用小写字母并用下划线分割 禁止使用MySQ...

41111
来自专栏DeveWork

WordPress主题下funtions.php的一段“恶意”代码

不多说了,相信有很多WordPresser都知道这段在WordPress主题下fountions.php的“恶意”代码,之所以为“恶意”加个双引号是想说:其实也...

31210
来自专栏Spark学习技巧

Java面试中常问的数据库方面问题

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的

1192
来自专栏python学习路

一、Mysql(1)

  数据库简介 人类在进化的过程中,创造了数字、文字、符号等来进行数据的记录,但是承受着认知能力和创造能力的提升,数据量越来越大,对于数据的记录和准确查找,成为...

3649

扫码关注云+社区

领取腾讯云代金券