From: Mike Bayer Date: Thu, 11 Sep 2008 19:35:40 +0000 (+0000) Subject: - Added scalar() and value() methods to Query, each return a X-Git-Tag: rel_0_5rc1~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=37d59c1b7fe616201722c71968ba11db2d19bbcb;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Added scalar() and value() methods to Query, each return a single scalar value. scalar() takes no arguments and is roughly equivalent to first()[0], value() takes a single column expression and is roughly equivalent to values(expr).next()[0]. --- diff --git a/CHANGES b/CHANGES index 1d98d811cb..ac04eec75d 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,12 @@ CHANGES objects such as Query(table.c.col) will return the "key" attribute of the Column. + - Added scalar() and value() methods to Query, each return a + single scalar value. scalar() takes no arguments and is + roughly equivalent to first()[0], value() + takes a single column expression and is roughly equivalent to + values(expr).next()[0]. + - Improved the determination of the FROM clause when placing SQL expressions in the query() list of entities. In particular scalar subqueries should not "leak" their inner FROM objects diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index c9f29e6be6..c2d47afeae 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -550,6 +550,11 @@ class Query(object): return iter(q) _values = values + def value(self, column): + """Return a scalar result corresponding to the given column expression.""" + + return self.values(column).next()[0] + @_generative() def add_column(self, column): """Add a SQL ColumnElement to the list of result columns to be returned.""" diff --git a/test/orm/query.py b/test/orm/query.py index fb16ae780b..ffc7104c82 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -568,6 +568,7 @@ class AggregateTest(QueryTest): sess = create_session() orders = sess.query(Order).filter(Order.id.in_([2, 3, 4])) self.assertEquals(orders.values(func.sum(Order.user_id * Order.address_id)).next(), (79,)) + self.assertEquals(orders.value(func.sum(Order.user_id * Order.address_id)), 79) def test_apply(self): sess = create_session()