Unlabeled expression in column_property doesn't work with query.one()/first()

Issue #1022 resolved
Former user created an issue

(original reporter: ged) In fact, the problem I had in ticket #1019 wasn't Elixir-specific after all. It's just my test case was slightly different from within Elixir than in pure SA.

Here is an SA-only test case demonstrating a strange problem: having an unlabeled expression in a column_property seem to conflict with the one() and first() methods of query. The traceback is:

Traceback (most recent call last):
  File "test_column_property.py", line 97, in <module>
    category = session.query(Category).one()
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/query.py", line 921, in one
    ret = list(self[0:2](0:2))
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/query.py", line 931, in __iter__
    context = self._compile_context()
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/query.py", line 1165, in _compile_context
    eager_joins = local_adapter.traverse(context.eager_joins)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/util.py", line 326, in traverse
    return visitors.ClauseVisitor.traverse(self, obj, clone=True)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/visitors.py", line 73, in traverse
    return self._cloned_traversal(obj)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/visitors.py", line 108, in _cloned_traversal
    return self._cloned_traversal_impl(obj, util.Set(stop_on), {}, _clone_toplevel=True)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/visitors.py", line 121, in _cloned_traversal_impl
    elem._copy_internals(clone=clone)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 2304, in _copy_internals
    self.onclause = clone(self.onclause)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/visitors.py", line 120, in clone
    return self._clone_element(element, stop_on, cloned)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/visitors.py", line 93, in _clone_element
    newelem = v.before_clone(elem)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/util.py", line 359, in before_clone
    newcol = self.selectable.corresponding_column(col, require_embedded=True)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 1731, in corresponding_column
    if self.c.contains_column(column):
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 1768, in attr
    self._export_columns()
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 1786, in _export_columns
    self._populate_column_collection()
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 2407, in _populate_column_collection
    for col in self.selectable.columns:
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 1768, in attr
    self._export_columns()
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 1786, in _export_columns
    self._populate_column_collection()
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 3253, in _populate_column_collection
    c._make_proxy(self, name=self.use_labels and c._label or None)
  File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/sql/expression.py", line 2462, in __getattr__
    return getattr(self.elem, attr)
AttributeError: 'Select' object has no attribute '_label'

Using all() works as expected. And adding a .label(None) to the expression fixes it too.

Comments (4)

  1. Log in to comment