.. changelog::
:version: 1.0.9
+ .. change::
+ :tags: feature, orm
+ :versions: 1.1.0b1
+ :pullreq: github:201
+
+ Added new method :meth:`.Query.one_or_none`; same as
+ :meth:`.Query.one` but returns None if no row found. Pull request
+ courtesy esiegerman.
+
.. change::
:tags: bug, orm
:versions: 1.1.0b1
to again work as it is based on an 8.0.x version of Postgresql.
Fix courtesy Pete Hollobon.
- .. change::
- :tags: orm
-
- Add Query.one_or_none() method.
.. changelog::
:version: 1.0.8
raise orm_exc.MultipleResultsFound(
"Multiple rows were found for one()")
+ def one_or_none(self):
+ """Return one or zero results, or raise an exception for multiple
+ rows.
+
+ Equivalent to :meth:`.Query.one_or_none`.
+
+ .. versionadded:: 1.0.9
+
+ """
+ ret = list(self)
+
+ l = len(ret)
+ if l == 1:
+ return ret[0]
+ elif l == 0:
+ return None
+ else:
+ raise orm_exc.MultipleResultsFound(
+ "Multiple rows were found for one()")
+
def all(self):
"""Return all rows.
Calling ``one_or_none()`` results in an execution of the underlying
query.
- .. versionchanged:: 1.0.9
- Added ``one_or_none()``
+ .. versionadded:: 1.0.9
+
+ Added :meth:`.Query.one_or_none`
+
"""
ret = list(self)
any kind of limit, so that the "unique"-ing of entities does not
conceal multiple object identities.
+ .. seealso::
+
+ :meth:`.Query.first`
+
+ :meth:`.Query.one_or_none`
+
"""
ret = list(self)
(8, )
)
+ def test_one_or_none_no_result(self):
+ User = self.classes.User
+
+ bq = self.bakery(lambda s: s.query(User))
+ bq += lambda q: q.filter(User.name == 'asdf')
+
+ eq_(
+ bq(Session()).one_or_none(),
+ None
+ )
+
+ def test_one_or_none_result(self):
+ User = self.classes.User
+
+ bq = self.bakery(lambda s: s.query(User))
+ bq += lambda q: q.filter(User.name == 'ed')
+
+ u1 = bq(Session()).one_or_none()
+ eq_(u1.name, 'ed')
+
def test_one_no_result(self):
User = self.classes.User