=======
0.5.0rc5
========
-- bugfixes
+- bugfixes, behavioral changes
+- orm
+ - Query.select_from(), from_statement() ensure
+ that the given argument is a FromClause,
+ or Text/Select/Union, respectively.
+
+ - Query.add_column() can accept FromClause objects
+ in the same manner as session.query() can.
+
- postgres
- Calling alias.execute() in conjunction with
server_side_cursors won't raise AttributeError.
"""Add a SQL ColumnElement to the list of result columns to be returned."""
self._entities = list(self._entities)
- c = _ColumnEntity(self, column)
- self.__setup_aliasizers([c])
+ l = len(self._entities)
+ _ColumnEntity(self, column)
+ # _ColumnEntity may add many entities if the
+ # given arg is a FROM clause
+ self.__setup_aliasizers(self._entities[l:])
def options(self, *args):
"""Return a new Query object, applying the given list of
if isinstance(from_obj, (tuple, list)):
util.warn_deprecated("select_from() now accepts a single Selectable as its argument, which replaces any existing FROM criterion.")
from_obj = from_obj[-1]
+ if not isinstance(from_obj, expression.FromClause):
+ raise sa_exc.ArgumentError("select_from() accepts FromClause objects only.")
self.__set_select_from(from_obj)
def __getitem__(self, item):
"""
if isinstance(statement, basestring):
statement = sql.text(statement)
+
+ if not isinstance(statement, (expression._TextClause, expression._SelectBaseMixin)):
+ raise sa_exc.ArgumentError("from_statement accepts text(), select(), and union() objects only.")
+
self._statement = statement
def first(self):
# this is fine, however
q.from_self()
+ def test_invalid_select_from(self):
+ s = create_session()
+ q = s.query(User)
+ self.assertRaises(sa_exc.ArgumentError, q.select_from, User.id==5)
+ self.assertRaises(sa_exc.ArgumentError, q.select_from, User.id)
+
+ def test_invalid_from_statement(self):
+ s = create_session()
+ q = s.query(User)
+ self.assertRaises(sa_exc.ArgumentError, q.from_statement, User.id==5)
+ self.assertRaises(sa_exc.ArgumentError, q.from_statement, users.join(addresses))
+
+ def test_invalid_column(self):
+ s = create_session()
+ q = s.query(User)
+ self.assertRaises(sa_exc.InvalidRequestError, q.add_column, object())
+
def test_mapper_zero(self):
s = create_session()
self.assertRaises(sa_exc.InvalidRequestError, sess.query(User).add_column, object())
+ def test_add_multi_columns(self):
+ """test that add_column accepts a FROM clause."""
+
+ sess = create_session()
+
+ eq_(
+ sess.query(User.id).add_column(users).all(),
+ [(7, 7, u'jack'), (8, 8, u'ed'), (9, 9, u'fred'), (10, 10, u'chuck')]
+ )
+
def test_multi_columns_2(self):
"""test aliased/nonalised joins with the usage of add_column()"""
sess = create_session()