阿里云服务器ECS    
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新 [咨询更多]
阿里云存储OSS
简单易用、多重冗余、数据备份高可靠、多层次安全防护安全性更强、低成本 [咨询更多]
阿里云数据库RDS
稳定可靠、可弹性伸缩、更拥有容灾、备份、恢复、监控、迁移等方面的全套解决方案 [咨询更多]
阿里云安全产品
DDoS高防IP、web应用防火墙、安骑士、sll证书、态势感知众多阿里云安全产品热销中 [咨询更多]
阿里云折扣优惠    
云服务器ECS、数据库、负载均衡等产品新购、续费、升级联系客服获取更多专属折扣 [咨询更多]
控制查询中的列数、排序
2020-9-10    点击量:

控制查询中的列数

为了限制查询返回的列数,需要以列表的形式把要查询的列传递给 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() 用作函数。

如果应用程序只需要返回结果的一部分,可以对返回的结果数量进行限制。

联系客服免费领取更多阿里云产品新购、续费升级折扣,叠加官网活动折上折更优惠