>>> for instance in session.query(User).order_by(User.id): ... print(instance.name, instance.fullname) ed Ed Jones wendy Wendy Williams mary Mary Contrary fred Fred Flinstone
>>> for name, fullname in session.query(User.name, User.fullname): ... print(name, fullname) ed Ed Jones wendy Wendy Williams mary Mary Contrary fred Fred Flinstone
>>> for u in session.query(User).order_by(User.id)[1:3]: ... print(u) <User(name='wendy', fullname='Wendy Williams', password='foobar')> <User(name='mary', fullname='Mary Contrary', password='xxg527')>
>>> for name, in session.query(User.name).\ ... filter_by(fullname='Ed Jones'): ... print(name) ed >>> for name, in session.query(User.name).\ ... filter(User.fullname=='Ed Jones'): ... print(name) ed
注意Query对象是generative的,这意味你可以把他们串接起来调用,如下:
1 2 3 4 5
>>> for user in session.query(User).\ ... filter(User.name=='ed').\ ... filter(User.fullname=='Ed Jones'): ... print(user) <User(name='ed', fullname='Ed Jones', password='f8s7ccs')>
>>> user = query.one() Traceback (most recent call last): ... MultipleResultsFound: Multiple rows were found for one()
没有查找到结果时:
1 2 3 4
>>> user = query.filter(User.id == 99).one() Traceback (most recent call last): ... NoResultFound: No row was found for one()
one_or_none():从名称可以看出,当结果数量为0时返回None, 多于1个时报错
scalar()和one()类似,但是返回单项而不是tuple
嵌入使用SQL
你可以在Query中通过text()使用SQL语句。例如:
1 2 3 4 5 6 7 8 9
>>> from sqlalchemy import text >>> for user in session.query(User).\ ... filter(text("id<224")).\ ... order_by(text("id")).all(): ... print(user.name) ed wendy mary fred
>>> session.query(User).from_statement( ... text("SELECT * FROM users where name=:name")).\ ... params(name='ed').all() [<User(name='ed', fullname='Ed Jones', password='f8s7ccs')>]
计数
Query定义了一个很方便的计数函数count()
1 2 3 4 5 6 7 8 9 10
>>> session.query(User).filter(User.name.like('%ed')).count() SELECT count(*) AS count_1 FROM (SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE users.name LIKE ?) AS anon_1 ('%ed',) 2
注意上面我们同时列出了实际的SQL指令。在SQLAlchemy中,我们总是将被计数的查询打包成一个子查询,然后对这个子查询进行计数。即便是最简单的SELECT count(*) FROM table,也会如此处理。为了更精细的控制计数过程,我们可以采用func.count()这个函数。
1 2 3 4 5 6
>>> from sqlalchemy import func SQL>>> session.query(func.count(User.name).label('ucnt'), User.name).group_by(User.name).all() SELECT count(users.name) AS count_1, users.name AS users_name FROM users GROUP BY users.name () [(1, u'ed'), (1, u'fred'), (1, u'mary'), (1, u'wendy')]
为了实现最简单的SELECT count(*) FROM table,我们可以如下调用
1 2 3 4 5
>>> session.query(func.count('*').label('ucnt')).select_from(User).scalar() SELECT count(?) AS count_1 FROM users ('*',) 4
如果我们对User的主键进行计数,那么select_from也可以省略。
1 2 3 4 5
>>> session.query(func.count(User.id)).scalar() SELECT count(users.id) AS count_1 FROM users () 4