diff options
Diffstat (limited to 'lib/sqlalchemy/ext/baked.py')
| -rw-r--r-- | lib/sqlalchemy/ext/baked.py | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/lib/sqlalchemy/ext/baked.py b/lib/sqlalchemy/ext/baked.py index fdcaec559..112e245f7 100644 --- a/lib/sqlalchemy/ext/baked.py +++ b/lib/sqlalchemy/ext/baked.py @@ -383,7 +383,7 @@ class Result(object): return str(self._as_query()) def __iter__(self): - return self._iter().__iter__() + return iter(self._iter()) def _iter(self): bq = self.bq @@ -463,15 +463,16 @@ class Result(object): Equivalent to :meth:`_query.Query.first`. """ - bq = self.bq.with_criteria(lambda q: q.slice(0, 1)) - return ( + ret = list( bq.for_session(self.session) .params(self._params) ._using_post_criteria(self._post_criteria) - ._iter() - .first() ) + if len(ret) > 0: + return ret[0] + else: + return None def one(self): """Return exactly one result or raise an exception. @@ -479,7 +480,19 @@ class Result(object): Equivalent to :meth:`_query.Query.one`. """ - return self._iter().one() + try: + ret = self.one_or_none() + except orm_exc.MultipleResultsFound as err: + util.raise_( + orm_exc.MultipleResultsFound( + "Multiple rows were found for one()" + ), + replace_context=err, + ) + 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 @@ -490,7 +503,17 @@ class Result(object): .. versionadded:: 1.0.9 """ - return self._iter().one_or_none() + 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_or_none()" + ) def all(self): """Return all rows. |
