From: Eric Siegerman Date: Mon, 28 Sep 2015 16:08:19 +0000 (-0400) Subject: Remplement Query.one() in terms of .one_or_none() X-Git-Tag: rel_1_1_0b1~84^2~70^2~80^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e5e6ff96cc92f342bc53242703991f915741966;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Remplement Query.one() in terms of .one_or_none() Thanks to Mike Bayer for suggesting a simpler refactoring. --- diff --git a/lib/sqlalchemy/ext/baked.py b/lib/sqlalchemy/ext/baked.py index d8c8843f6d..ee9f6f9bbc 100644 --- a/lib/sqlalchemy/ext/baked.py +++ b/lib/sqlalchemy/ext/baked.py @@ -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 diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index f0b8969a2a..16ead950ea 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -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 diff --git a/test/ext/test_baked.py b/test/ext/test_baked.py index 9534c29e91..8bf697fbfb 100644 --- a/test/ext/test_baked.py +++ b/test/ext/test_baked.py @@ -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 ) diff --git a/test/orm/test_query.py b/test/orm/test_query.py index 4ae0b010a3..d7069733ee 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -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,