summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-08-21 19:38:28 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2010-08-21 19:38:28 -0400
commitac9eb5c9c3bc33c38eff5407fa4724c9277ba342 (patch)
treebdadc6eb2196ca789df900de566e9b108dbf0736 /lib/sqlalchemy
parent61562e58435efddda19d15c61afd6e5326745a31 (diff)
downloadsqlalchemy-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.py3
-rw-r--r--lib/sqlalchemy/orm/properties.py11
-rw-r--r--lib/sqlalchemy/sql/expression.py6
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,