Unlabeled expression in column_property doesn't work with query.one()/first()
(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)
-
repo owner -
repo owner - changed status to resolved
the official "fix" is in 0.5 and is just
ColumnProperty
makes labels. selectable aliasing really needs at least the label object to hold onto when targeting columns.behavior is still improved in 0.4, as the "eager" loading wasn't actually finding the column even in the eager case.
related commits b6c4740af0420ade63d8ceb920d3c0c073896b26, 538861143f66e7299f60b42a505242edd6351908
-
Account Deleted (original author: ged) Thanks for the quick fix (as usual).
-
repo owner - removed milestone
Removing milestone: 0.5.0 (automated comment)
- Log in to comment
theres a fix in fd5543b78e071a24652ab040c3029b7aea29f7d7 but its not really complete, as I've identified some heisenbug conditions with it in the 0.5 branch. ill ensure it works in 0.5 but 0.4 is not a guarantee as of yet.