summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-01-10 11:43:47 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2012-01-10 11:43:47 -0500
commitf2568b9bdedd12427aaaed393c68dcf20691ea11 (patch)
tree46d6c04de66ceeb1d84aef63d6982bdb2317e2bb /lib/sqlalchemy
parentd78d2d60aa30b0b6c3c230ddf3cafda2529e6409 (diff)
downloadsqlalchemy-f2568b9bdedd12427aaaed393c68dcf20691ea11.tar.gz
- Fixed regression from 0.6 whereby if
"load_on_pending" relationship() flag were used where a non-"get()" lazy clause needed to be emitted on a pending object, it would fail to load.
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/sql/compiler.py9
-rw-r--r--lib/sqlalchemy/sql/expression.py15
-rw-r--r--lib/sqlalchemy/sql/util.py8
3 files changed, 18 insertions, 14 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py
index aa744e0c1..724e7dc2a 100644
--- a/lib/sqlalchemy/sql/compiler.py
+++ b/lib/sqlalchemy/sql/compiler.py
@@ -305,18 +305,13 @@ class SQLCompiler(engine.Compiled):
raise exc.InvalidRequestError(
"A value is required for bind parameter %r"
% bindparam.key)
- elif bindparam.callable:
- pd[name] = bindparam.callable()
else:
- pd[name] = bindparam.value
+ pd[name] = bindparam.effective_value
return pd
else:
pd = {}
for bindparam in self.bind_names:
- if bindparam.callable:
- pd[self.bind_names[bindparam]] = bindparam.callable()
- else:
- pd[self.bind_names[bindparam]] = bindparam.value
+ pd[self.bind_names[bindparam]] = bindparam.effective_value
return pd
params = property(construct_params, doc="""
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py
index 15d2970c2..9f2a16195 100644
--- a/lib/sqlalchemy/sql/expression.py
+++ b/lib/sqlalchemy/sql/expression.py
@@ -2606,6 +2606,21 @@ class _BindParamClause(ColumnElement):
else:
self.type = type_
+ @property
+ def effective_value(self):
+ """Return the value of this bound parameter,
+ taking into account if the ``callable`` parameter
+ was set.
+
+ The ``callable`` value will be evaluated
+ and returned if present, else ``value``.
+
+ """
+ if self.callable:
+ return self.callable()
+ else:
+ return self.value
+
def _clone(self):
c = ClauseElement._clone(self)
if self.unique:
diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py
index 33be99d87..97975441e 100644
--- a/lib/sqlalchemy/sql/util.py
+++ b/lib/sqlalchemy/sql/util.py
@@ -152,13 +152,7 @@ def bind_values(clause):
v = []
def visit_bindparam(bind):
- value = bind.value
-
- # evaluate callables
- if callable(value):
- value = value()
-
- v.append(value)
+ v.append(bind.effective_value)
visitors.traverse(clause, {}, {'bindparam':visit_bindparam})
return v