summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/crud.py
diff options
context:
space:
mode:
authorSławek Ehlert <slafs@op.pl>2015-01-27 22:04:38 +0100
committerSławek Ehlert <slafs@op.pl>2015-01-27 22:04:38 +0100
commit57b2bd5dcba6140b511c898c0f682234f13d5c51 (patch)
treea0899b2a35d27e177001b163054c3c9a8f7f1c06 /lib/sqlalchemy/sql/crud.py
parent6a1f16d09958e549502a0991890d64964c71b357 (diff)
parent8aaa8dd6bdfb85fa481efa3115b9080d935d344c (diff)
downloadsqlalchemy-pr/152.tar.gz
Merge branch 'master' into oracle-servicename-optionpr/152
Diffstat (limited to 'lib/sqlalchemy/sql/crud.py')
-rw-r--r--lib/sqlalchemy/sql/crud.py66
1 files changed, 46 insertions, 20 deletions
diff --git a/lib/sqlalchemy/sql/crud.py b/lib/sqlalchemy/sql/crud.py
index 831d05be1..2961f579f 100644
--- a/lib/sqlalchemy/sql/crud.py
+++ b/lib/sqlalchemy/sql/crud.py
@@ -116,11 +116,12 @@ def _get_crud_params(compiler, stmt, **kw):
def _create_bind_param(
- compiler, col, value, process=True, required=False, name=None):
+ compiler, col, value, process=True,
+ required=False, name=None):
if name is None:
name = col.key
- bindparam = elements.BindParameter(name, value,
- type_=col.type, required=required)
+ bindparam = elements.BindParameter(
+ name, value, type_=col.type, required=required)
bindparam._is_crud = True
if process:
bindparam = bindparam._compiler_dispatch(compiler)
@@ -300,13 +301,45 @@ def _append_param_insert_pk_returning(compiler, stmt, c, values, kw):
compiler.returning.append(c)
else:
values.append(
- (c, _create_bind_param(compiler, c, None))
+ (c, _create_prefetch_bind_param(compiler, c))
)
- compiler.prefetch.append(c)
+
else:
compiler.returning.append(c)
+def _create_prefetch_bind_param(compiler, c, process=True, name=None):
+ param = _create_bind_param(compiler, c, None, process=process, name=name)
+ compiler.prefetch.append(c)
+ return param
+
+
+class _multiparam_column(elements.ColumnElement):
+ def __init__(self, original, index):
+ self.key = "%s_%d" % (original.key, index + 1)
+ self.original = original
+ self.default = original.default
+
+ def __eq__(self, other):
+ return isinstance(other, _multiparam_column) and \
+ other.key == self.key and \
+ other.original == self.original
+
+
+def _process_multiparam_default_bind(compiler, c, index, kw):
+
+ if not c.default:
+ raise exc.CompileError(
+ "INSERT value for column %s is explicitly rendered as a bound"
+ "parameter in the VALUES clause; "
+ "a Python-side value or SQL expression is required" % c)
+ elif c.default.is_clause_element:
+ return compiler.process(c.default.arg.self_group(), **kw)
+ else:
+ col = _multiparam_column(c, index)
+ return _create_prefetch_bind_param(compiler, col)
+
+
def _append_param_insert_pk(compiler, stmt, c, values, kw):
if (
(c.default is not None and
@@ -318,11 +351,9 @@ def _append_param_insert_pk(compiler, stmt, c, values, kw):
preexecute_autoincrement_sequences)
):
values.append(
- (c, _create_bind_param(compiler, c, None))
+ (c, _create_prefetch_bind_param(compiler, c))
)
- compiler.prefetch.append(c)
-
def _append_param_insert_hasdefault(
compiler, stmt, c, implicit_return_defaults, values, kw):
@@ -350,9 +381,8 @@ def _append_param_insert_hasdefault(
compiler.postfetch.append(c)
else:
values.append(
- (c, _create_bind_param(compiler, c, None))
+ (c, _create_prefetch_bind_param(compiler, c))
)
- compiler.prefetch.append(c)
def _append_param_insert_select_hasdefault(
@@ -369,9 +399,8 @@ def _append_param_insert_select_hasdefault(
values.append((c, proc))
else:
values.append(
- (c, _create_bind_param(compiler, c, None, process=False))
+ (c, _create_prefetch_bind_param(compiler, c, process=False))
)
- compiler.prefetch.append(c)
def _append_param_update(
@@ -390,9 +419,8 @@ def _append_param_update(
compiler.postfetch.append(c)
else:
values.append(
- (c, _create_bind_param(compiler, c, None))
+ (c, _create_prefetch_bind_param(compiler, c))
)
- compiler.prefetch.append(c)
elif c.server_onupdate is not None:
if implicit_return_defaults and \
c in implicit_return_defaults:
@@ -445,12 +473,9 @@ def _get_multitable_params(
compiler.postfetch.append(c)
else:
values.append(
- (c, _create_bind_param(
- compiler, c, None, name=_col_bind_name(c)
- )
- )
+ (c, _create_prefetch_bind_param(
+ compiler, c, name=_col_bind_name(c)))
)
- compiler.prefetch.append(c)
elif c.server_onupdate is not None:
compiler.postfetch.append(c)
@@ -469,7 +494,8 @@ def _extend_values_for_multiparams(compiler, stmt, values, kw):
) if elements._is_literal(row[c.key])
else compiler.process(
row[c.key].self_group(), **kw))
- if c.key in row else param
+ if c.key in row else
+ _process_multiparam_default_bind(compiler, c, i, kw)
)
for (c, param) in values_0
]