77

我有以下查询:

profiles = session.query(profile.name).filter(and_(profile.email == email, profile.password == password_hash))

我如何检查是否有一行以及如何只返回第一个(如果有匹配则应该只有一个)?

4

4 回答 4

129

用于 query.one()得到一个,并且恰好是一个结果。在所有其他情况下,它将引发您可以处理的异常:

from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm.exc import MultipleResultsFound

try:
    user = session.query(User).one()
except MultipleResultsFound, e:
    print e
    # Deal with it
except NoResultFound, e:
    print e
    # Deal with that as well

还有query.first(),它会给你可能很多的第一个结果,而不会引发这些异常。但是既然你想处理没有结果或者比你想象的更多的情况,这query.one()正是你应该使用的。

于 2013-08-07T17:47:44.243 回答
59

您可以first()在 Query 对象上使用该函数。这将返回第一个结果,如果没有结果,则返回 None。

result = session.query(profile.name).filter(...).first()

if not result:
    print 'No result found'

或者,您可以使用one(),这将为您提供唯一的项目,但会为具有零个或多个结果的查询引发异常。

from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
try:
    result = session.query(profile.name).filter(...).one()
    print result
except NoResultFound:
    print 'No result was found'
except MultipleResultsFound:
    print 'Multiple results were found'
于 2013-08-07T17:51:41.017 回答
14

假设您有一个模型用户,您可以通过以下方式获得第一个结果:

User.query.first()

如果表为空,它将返回 None。

于 2019-01-24T04:42:42.130 回答
8

使用one_or_none()。最多返回一个结果或引发异常。

如果查询未选择任何行,则返回 None。

于 2016-09-13T06:38:53.763 回答