summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine/default.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-10-15 18:41:02 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-10-15 18:41:02 +0000
commitc5571ab19a155f0c11381d65edc07c16902f3fad (patch)
tree91d1177483fccf28f5527b1842f838c4623013fe /lib/sqlalchemy/engine/default.py
parentbc351a2dc423987f05f4bf88db4987be507ee0a1 (diff)
downloadsqlalchemy-c5571ab19a155f0c11381d65edc07c16902f3fad.tar.gz
- an executemany() now requires that all bound parameter
sets require that all keys are present which are present in the first bound parameter set. The structure and behavior of an insert/update statement is very much determined by the first parameter set, including which defaults are going to fire off, and a minimum of guesswork is performed with all the rest so that performance is not impacted. For this reason defaults would otherwise silently "fail" for missing parameters, so this is now guarded against. [ticket:1566]
Diffstat (limited to 'lib/sqlalchemy/engine/default.py')
-rw-r--r--lib/sqlalchemy/engine/default.py19
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py
index 12ab605e4..ad728da9c 100644
--- a/lib/sqlalchemy/engine/default.py
+++ b/lib/sqlalchemy/engine/default.py
@@ -232,7 +232,7 @@ class DefaultExecutionContext(base.ExecutionContext):
self.compiled_parameters = [compiled.construct_params()]
self.executemany = False
else:
- self.compiled_parameters = [compiled.construct_params(m) for m in parameters]
+ self.compiled_parameters = [compiled.construct_params(m, _group_number=grp) for grp,m in enumerate(parameters)]
self.executemany = len(parameters) > 1
self.cursor = self.create_cursor()
@@ -508,11 +508,22 @@ class DefaultExecutionContext(base.ExecutionContext):
if self.executemany:
if len(self.compiled.prefetch):
- params = self.compiled_parameters
- for param in params:
+ scalar_defaults = {}
+
+ # pre-determine scalar Python-side defaults
+ # to avoid many calls of get_insert_default()/get_update_default()
+ for c in self.compiled.prefetch:
+ if self.isinsert and c.default and c.default.is_scalar:
+ scalar_defaults[c] = c.default.arg
+ elif self.isupdate and c.onupdate and c.onupdate.is_scalar:
+ scalar_defaults[c] = c.onupdate.arg
+
+ for param in self.compiled_parameters:
self.current_parameters = param
for c in self.compiled.prefetch:
- if self.isinsert:
+ if c in scalar_defaults:
+ val = scalar_defaults[c]
+ elif self.isinsert:
val = self.get_insert_default(c)
else:
val = self.get_update_default(c)