:meth:`.Query.order_by` has worked for a long time. Pull request
courtesy Iuri Diniz.
+ .. change::
+ :tags: bug, sql
+ :tickets: 3763
+
+ Fixed bug where :class:`.Index` would fail to extract columns from
+ compound SQL expressions if those SQL expressions were wrapped inside
+ of an ORM-style ``__clause_element__()`` construct. This bug
+ exists in 1.0.x as well, however in 1.1 is more noticeable as
+ hybrid_property @expression now returns a wrapped element.
+
.. changelog::
:version: 1.1.0b3
:released: July 26, 2016
for expr in expressions:
strname = None
column = None
- if not isinstance(expr, ClauseElement):
+ if hasattr(expr, '__clause_element__'):
+ expr = expr.__clause_element__()
+
+ if not isinstance(expr, (ColumnElement, TextClause)):
# this assumes a string
strname = expr
else:
idx = Index('q', c)
is_(idx.table, None) # lower-case-T table doesn't have indexes
+ def test_clauseelement_extraction_one(self):
+ t = Table('t', MetaData(), Column('x', Integer), Column('y', Integer))
+
+ class MyThing(object):
+ def __clause_element__(self):
+ return t.c.x + 5
+
+ idx = Index('foo', MyThing())
+ self._assert_index_col_x(t, idx)
+
+ def test_clauseelement_extraction_two(self):
+ t = Table('t', MetaData(), Column('x', Integer), Column('y', Integer))
+
+ class MyThing(object):
+ def __clause_element__(self):
+ return t.c.x + 5
+
+ idx = Index('bar', MyThing(), t.c.y)
+
+ eq_(set(t.indexes), set([idx]))
+
def test_table_references(self):
t1, t2, t3 = self._single_fixture()
assert list(t2.c.a.foreign_keys)[0].references(t1)
def __clause_element__(self):
return t2
- assert_raises(
+ assert_raises_message(
exc.ArgumentError,
+ "Element Table\('t2', .* is not a string name or column element",
Index, "foo", SomeClass()
)