控制查询中的列数、排序
网站编辑2020-09-10 14:14:20517
控制查询中的列数
为了限制查询返回的列数,需要以列表的形式把要查询的列传递给 select() 方法。例如,你想运行一个查询,该查询只返回 cookie 的名称和数量,如示例 2-10 所示。
示例 2-10 只包含
cookie_name和quantity
s = select([cookies.c.cookie_name, cookies.c.quantity])
rp = connection.execute(s)
print(rp.keys()) ?
result = rp.first() ?? 返回所选列的列表,在本例中是 ['cookie_name','quantity'](这只用来演示,不是必需的)。
? 请注意,这条语句只返回第一个结果。
结果如下:
(u'chocolate chip', 12),我们已经可以构建简单的 select 语句了,接下来看看还可以做些什么来改变 select 语句返回结果的方式。首先学习如何改变返回结果的顺序。
排序
如果查看示例 2-10 的所有结果,而不仅仅是第一条记录,你会发现数据并不是按照特定顺序排列的。如果希望返回的列表有特定的顺序,可以使用 order_by() 语句,如示例 2-11 所示。示例中,我们希望结果按照现有 cookie 的数量进行排序。
示例 2-11 按
quantity进行升序排列
s = select([cookies.c.cookie_name, cookies.c.quantity])
s = s.order_by(cookies.c.quantity)
rp = connection.execute(s)
for cookie in rp:
print('{} - {}'.format(cookie.quantity, cookie.cookie_name))结果如下:
1 - dark chocolate chip
12 - chocolate chip
24 - peanut butter
100 - oatmeal raisin我们先把 select 语句保存到变量 s 中,而后向变量 s 中添加 order_by 语句,再将其重新赋给 s 变量。这个示例演示了如何以生成式或分步方式编写语句。也可以把 select 和 order_by 语句放在一行中,如下所示:
s = select([...]).order_by(...)然而,当 select 中有完整的列列表,order_by 语句中有 order 列时,它超过了 Python 每行 79 个字符的限制(这是在 PEP8 中建立的)。通过使用生成类型语句,可以保持不超出该限制。在本书中,我们将看到一些例子,其中生成类型语句可以带来额外的好处,例如有条件地向语句中添加内容。现在,尝试按照每行 79 个字符的限制分割语句,这将有助于提升代码的可读性。
如果你想按倒序或降序排列,可使用 desc() 语句。desc() 函数的作用是按降序包装你要排序的特定列,如示例 2-12 所示。
示例 2-12 按照
quantity进行降序排列
from sqlalchemy import desc
s = select([cookies.c.cookie_name, cookies.c.quantity])
s = s.order_by(desc(cookies.c.quantity)) ?? 请注意,这一行中,我们使用 desc() 函数对 cookies.c.quantity 列进行了包装。
![]()
desc()函数还可以作为Column对象(比如cookie.c.quantity.desc())的方法进行调用。但是,如果在长语句中这样使用,可能会造成阅读困难,所以我总是把desc()用作函数。
如果应用程序只需要返回结果的一部分,可以对返回的结果数量进行限制。







