为了限制查询返回的列数,需要以列表的形式把要查询的列传递给 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()
用作函数。
如果应用程序只需要返回结果的一部分,可以对返回的结果数量进行限制。