查询对象
Query是Session使用以下query()方法生成的:
q = session.query(SomeMappedClass)
# Query用法的完整演练
1.all()
将此表示的结果Query作为列表返回。
这导致执行基础查询
2.count()
返回此Query将返回的行数。
这将为此Query生成SQL,如下所示:
SELECT count(1) AS count_1 FROM (
SELECT <rest of query follows...>
) AS anon_1
要对要计数的特定列进行细粒度控制,跳过子查询的使用或以其他方式控制FROM子句,或使用其他聚合函数,请func 结合使用表达式query(),即:
from sqlalchemy import func
# count User records, without
# using a subquery.
session.query(func.count(User.id))
# return count of user "id" grouped
# by "name"
session.query(func.count(User.id)).\
group_by(User.name)
from sqlalchemy import distinct
# count distinct "name" values
session.query(func.count(distinct(User.name)))
3.scalar()
返回第一个结果的第一个元素,如果没有行,则返回None。如果返回多行,则引发MultipleResultsFound。
>>> session.query(Item).scalar()
<Item>
>>> session.query(Item.id).scalar()
1
>>> session.query(Item.id).filter(Item.id < 0).scalar()
None
>>> session.query(Item.id, Item.name).scalar()
1
>>> session.query(func.count(Parent.id)).scalar()
20
这导致执行基础查询。
4.with_entities(*实体)
返回一个新的Query替换SELECT列表与给定的实体。
例如:
# Users, filtered on some arbitrary criterion
# and then ordered by related email address
q = session.query(User).\
join(User.address).\
filter(User.name.like('%ed%')).\
order_by(Address.email)
# given *only* User.id==5, Address.email, and 'q', what
# would the *next* User in the result be ?
subq = q.with_entities(Address.email).\
order_by(None).\
filter(User.id==5).\
subquery()
q = q.join((subq, subq.c.email < Address.email)).\
limit(1)