]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- replicate Query.one_or_none to BakedQuery
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 24 Sep 2015 17:52:25 +0000 (13:52 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 24 Sep 2015 17:53:26 +0000 (13:53 -0400)
- changelog / version note finishing

(cherry picked from commit 5b71858533ea153dec119b3592631fdb1500a15f)

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/ext/baked.py
lib/sqlalchemy/orm/query.py
test/ext/test_baked.py

index 5c5ffed1d6bbeedfe47b049ada003b2fb1f599d4..ef125eecff43d4c232792a11c9de23767d8f6dc7 100644 (file)
 .. 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
index f01e0b348dcd22687f52609b559a184441f9d56f..a933e7eb717f0baaebc43bd27bc40a4f266003f2 100644 (file)
@@ -283,6 +283,26 @@ class Result(object):
             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.
 
index 7d05b9b8f3fe479ebff8446873d007ae35540708..d3c69060bc9773473132007b10010b2bb2890bde 100644 (file)
@@ -2489,8 +2489,10 @@ class Query(object):
         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)
 
@@ -2524,6 +2526,12 @@ class Query(object):
             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)
 
index 78c43fc7e0e5a3c0eae2453400829a8c378e9d09..ae335db025a44a6383c628173890f909e447b631 100644 (file)
@@ -151,6 +151,26 @@ class LikeQueryTest(BakedTest):
             (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