Thanks to Mike Bayer for suggesting a simpler refactoring.
Equivalent to :meth:`.Query.one`.
"""
- ret = list(self)
-
- l = len(ret)
- if l == 1:
- return ret[0]
- elif l == 0:
- raise orm_exc.NoResultFound("No row was found for one()")
- else:
+ try:
+ ret = self.one_or_none()
+ except orm_exc.MultipleResultsFound:
raise orm_exc.MultipleResultsFound(
"Multiple rows were found for one()")
+ else:
+ if ret is None:
+ raise orm_exc.NoResultFound("No row was found for one()")
+ return ret
def one_or_none(self):
"""Return one or zero results, or raise an exception for multiple
:meth:`.Query.one_or_none`
"""
- ret = list(self)
-
- l = len(ret)
- if l == 1:
- return ret[0]
- elif l == 0:
- raise orm_exc.NoResultFound("No row was found for one()")
- else:
+ try:
+ ret = self.one_or_none()
+ except orm_exc.MultipleResultsFound:
raise orm_exc.MultipleResultsFound(
"Multiple rows were found for one()")
+ else:
+ if ret is None:
+ raise orm_exc.NoResultFound("No row was found for one()")
+ return ret
def scalar(self):
"""Return the first element of the first result or None
bq = self.bakery(lambda s: s.query(User))
bq += lambda q: q.filter(User.name.like('%ed%'))
- assert_raises(
+ assert_raises_message(
orm_exc.MultipleResultsFound,
+ "Multiple rows were found for one_or_none()",
bq(Session()).one_or_none
)
sess = create_session()
- assert_raises(
+ assert_raises_message(
sa.orm.exc.NoResultFound,
+ "No row was found for one\(\)",
sess.query(User).filter(User.id == 99).one)
eq_(sess.query(User).filter(User.id == 7).one().id, 7)
- assert_raises(sa.orm.exc.MultipleResultsFound, sess.query(User).one)
+ assert_raises_message(
+ sa.orm.exc.MultipleResultsFound,
+ "Multiple rows were found for one\(\)",
+ sess.query(User).one)
assert_raises(
sa.orm.exc.NoResultFound,