我有以下查询:
profiles = session.query(profile.name).filter(and_(profile.email == email, profile.password == password_hash))
如何检查是否有一行,如何返回第一行(如果匹配则应该只有一行)?
答案 0 :(得分:80)
使用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()
正是你应该使用的。
答案 1 :(得分:32)
您可以在Query对象上使用first()
函数。这将返回第一个结果,如果没有结果,则返回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'
答案 2 :(得分:4)
使用one_or_none()。最多返回一个结果或引发异常。
如果查询没有选择任何行,则返回None。
答案 3 :(得分:3)
假设您有一个模型用户,则可以使用以下方法获得第一个结果:
User.query.first()
如果表为空,则将返回None。