summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/query.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/orm/query.py')
-rw-r--r--lib/sqlalchemy/orm/query.py78
1 files changed, 65 insertions, 13 deletions
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index 7e77c66a8..dc36f2f35 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -1292,7 +1292,9 @@ class Query(object):
session.query(MyClass).filter(MyClass.name == 'some name')
- Multiple criteria are joined together by AND::
+ Multiple criteria may be specified as comma separated; the effect
+ is that they will be joined together using the :func:`.and_`
+ function::
session.query(MyClass).\\
filter(MyClass.name == 'some name', MyClass.id > 5)
@@ -1301,9 +1303,6 @@ class Query(object):
WHERE clause of a select. String expressions are coerced
into SQL expression constructs via the :func:`.text` construct.
- .. versionchanged:: 0.7.5
- Multiple criteria joined by AND.
-
.. seealso::
:meth:`.Query.filter_by` - filter on keyword expressions.
@@ -1327,7 +1326,9 @@ class Query(object):
session.query(MyClass).filter_by(name = 'some name')
- Multiple criteria are joined together by AND::
+ Multiple criteria may be specified as comma separated; the effect
+ is that they will be joined together using the :func:`.and_`
+ function::
session.query(MyClass).\\
filter_by(name = 'some name', id = 5)
@@ -2463,6 +2464,12 @@ class Query(object):
Calling ``first()`` results in an execution of the underlying query.
+ .. seealso::
+
+ :meth:`.Query.one`
+
+ :meth:`.Query.one_or_none`
+
"""
if self._statement is not None:
ret = list(self)[0:1]
@@ -2473,6 +2480,46 @@ class Query(object):
else:
return None
+ def one_or_none(self):
+ """Return at most one result or raise an exception.
+
+ Returns ``None`` if the query selects
+ no rows. Raises ``sqlalchemy.orm.exc.MultipleResultsFound``
+ if multiple object identities are returned, or if multiple
+ rows are returned for a query that does not return object
+ identities.
+
+ Note that an entity query, that is, one which selects one or
+ more mapped classes as opposed to individual column attributes,
+ may ultimately represent many rows but only one row of
+ unique entity or entities - this is a successful result for
+ `one_or_none()`.
+
+ Calling ``one_or_none()`` results in an execution of the underlying
+ query.
+
+ .. versionadded:: 1.0.9
+
+ Added :meth:`.Query.one_or_none`
+
+ .. seealso::
+
+ :meth:`.Query.first`
+
+ :meth:`.Query.one`
+
+ """
+ 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 one(self):
"""Return exactly one result or raise an exception.
@@ -2494,17 +2541,22 @@ class Query(object):
any kind of limit, so that the "unique"-ing of entities does not
conceal multiple object identities.
- """
- ret = list(self)
+ .. seealso::
- l = len(ret)
- if l == 1:
- return ret[0]
- elif l == 0:
- raise orm_exc.NoResultFound("No row was found for one()")
- else:
+ :meth:`.Query.first`
+
+ :meth:`.Query.one_or_none`
+
+ """
+ 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