From: Jason Kirtland Date: Mon, 3 Nov 2008 00:09:33 +0000 (+0000) Subject: Added tests for Query.scalar(), .value() [ticket:1163] X-Git-Tag: rel_0_5rc3~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=27b48aa7e67938c104483a63ebe4f6bf6c08e6dc;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Added tests for Query.scalar(), .value() [ticket:1163] --- diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 93699b79a6..b358f43114 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -552,9 +552,11 @@ class Query(object): def value(self, column): """Return a scalar result corresponding to the given column expression.""" - - return self.values(column).next()[0] - + try: + return self.values(column).next()[0] + except StopIteration: + return None + @_generative() def add_column(self, column): """Add a SQL ColumnElement to the list of result columns to be returned.""" @@ -1058,6 +1060,8 @@ class Query(object): >>> session.query(Item.id).scalar() 1 + >>> session.query(Item.id).filter(Item.id < 0).scalar() + None >>> session.query(Item.id, Item.name).scalar() 1 >>> session.query(func.count(Parent.id)).scalar() @@ -1066,10 +1070,10 @@ class Query(object): This results in an execution of the underlying query. """ - ret = list(self)[0] - if not isinstance(ret, tuple): - return ret try: + ret = list(self)[0] + if not isinstance(ret, tuple): + return ret return ret[0] except IndexError: return None diff --git a/test/orm/query.py b/test/orm/query.py index 407757c10a..dcd0ac548a 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -1828,11 +1828,31 @@ class ImmediateTest(_fixtures.FixtureTest): self.assertRaises(sa.orm.exc.MultipleResultsFound, sess.query(User, Address).join(User.addresses).one) - @testing.future def test_getslice(self): assert False + @testing.resolve_artifact_names + def test_scalar(self): + sess = create_session() + + eq_(sess.query(User.id).filter_by(id=7).scalar(), 7) + eq_(sess.query(User.id, User.name).filter_by(id=7).scalar(), 7) + eq_(sess.query(User.id).filter_by(id=0).scalar(), None) + eq_(sess.query(User).filter_by(id=7).scalar(), + sess.query(User).filter_by(id=7).one()) + + @testing.resolve_artifact_names + def test_value(self): + sess = create_session() + + eq_(sess.query(User).filter_by(id=7).value(User.id), 7) + eq_(sess.query(User.id, User.name).filter_by(id=7).value(User.id), 7) + eq_(sess.query(User).filter_by(id=0).value(User.id), None) + + sess.bind = sa.testing.db + eq_(sess.query().value(sa.literal_column('1')), 1) + class SelectFromTest(QueryTest): keep_mappers = False