]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Remplement Query.one() in terms of .one_or_none()
authorEric Siegerman <eric.siegerman@rci.rogers.com>
Mon, 28 Sep 2015 16:08:19 +0000 (12:08 -0400)
committerEric Siegerman <eric.siegerman@rci.rogers.com>
Mon, 28 Sep 2015 16:08:19 +0000 (12:08 -0400)
Thanks to Mike Bayer for suggesting a simpler refactoring.

lib/sqlalchemy/ext/baked.py
lib/sqlalchemy/orm/query.py
test/ext/test_baked.py
test/orm/test_query.py

index d8c8843f6d71cab5b65c5c3163af7623d03d4f48..ee9f6f9bbc7d222f7aa45d509522918d1628d07e 100644 (file)
@@ -272,16 +272,15 @@ class Result(object):
         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
index f0b8969a2ac2d0b75086ac2b932381234ba30f87..16ead950ea6040c17bb1a60f683f298b480cc498 100644 (file)
@@ -2535,16 +2535,15 @@ class Query(object):
             :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
index 9534c29e918708f1a6d27dfa534e8171d46094e4..8bf697fbfb612fb04ce7b9ddcf358b8fae69d665 100644 (file)
@@ -178,8 +178,9 @@ class LikeQueryTest(BakedTest):
         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
         )
 
index 4ae0b010a36657a56cca1c7d20db3b2545ae94aa..d7069733eefa2893ef7e8e5f597935375cf23ff7 100644 (file)
@@ -3624,13 +3624,17 @@ class ImmediateTest(_fixtures.FixtureTest):
 
         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,