diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-08-21 19:38:28 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-08-21 19:38:28 -0400 |
| commit | ac9eb5c9c3bc33c38eff5407fa4724c9277ba342 (patch) | |
| tree | bdadc6eb2196ca789df900de566e9b108dbf0736 /lib/sqlalchemy | |
| parent | 61562e58435efddda19d15c61afd6e5326745a31 (diff) | |
| download | sqlalchemy-ac9eb5c9c3bc33c38eff5407fa4724c9277ba342.tar.gz | |
- Similarly, for relationship(), foreign_keys,
remote_side, order_by - all column-based
expressions are enforced - lists of strings
are explicitly disallowed since this is a
very common error
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/collections.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/properties.py | 11 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/expression.py | 6 |
3 files changed, 11 insertions, 9 deletions
diff --git a/lib/sqlalchemy/orm/collections.py b/lib/sqlalchemy/orm/collections.py index b5c4353b3..a9ad34239 100644 --- a/lib/sqlalchemy/orm/collections.py +++ b/lib/sqlalchemy/orm/collections.py @@ -129,7 +129,8 @@ def column_mapped_collection(mapping_spec): from sqlalchemy.orm.util import _state_mapper from sqlalchemy.orm.attributes import instance_state - cols = [expression._only_column_elements(q) for q in util.to_list(mapping_spec)] + cols = [expression._only_column_elements(q, "mapping_spec") + for q in util.to_list(mapping_spec)] if len(cols) == 1: def keyfunc(value): state = instance_state(value) diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index 5788c30f9..7e19d7b16 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -926,16 +926,17 @@ class RelationshipProperty(StrategizedProperty): for attr in 'primaryjoin', 'secondaryjoin': val = getattr(self, attr) if val is not None: - util.assert_arg_type(val, sql.ColumnElement, attr) - setattr(self, attr, _orm_deannotate(val)) + setattr(self, attr, _orm_deannotate( + expression._only_column_elements(val, attr)) + ) if self.order_by is not False and self.order_by is not None: - self.order_by = [expression._literal_as_column(x) for x in + self.order_by = [expression._only_column_elements(x, "order_by") for x in util.to_list(self.order_by)] self._user_defined_foreign_keys = \ - util.column_set(expression._literal_as_column(x) for x in + util.column_set(expression._only_column_elements(x, "foreign_keys") for x in util.to_column_set(self._user_defined_foreign_keys)) self.remote_side = \ - util.column_set(expression._literal_as_column(x) for x in + util.column_set(expression._only_column_elements(x, "remote_side") for x in util.to_column_set(self.remote_side)) if not self.parent.concrete: for inheriting in self.parent.iterate_to_root(): diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index a7f5d396a..6f593ab48 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -1037,12 +1037,12 @@ def _no_literals(element): else: return element -def _only_column_elements(element): +def _only_column_elements(element, name): if hasattr(element, '__clause_element__'): element = element.__clause_element__() if not isinstance(element, ColumnElement): - raise exc.ArgumentError("Column-based expression object expected; " - "got: %r" % element) + raise exc.ArgumentError("Column-based expression object expected for argument '%s'; " + "got: '%s', type %s" % (name, element, type(element))) return element def _corresponding_column_or_error(fromclause, column, |
