diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-10-15 18:41:02 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-10-15 18:41:02 +0000 |
| commit | c5571ab19a155f0c11381d65edc07c16902f3fad (patch) | |
| tree | 91d1177483fccf28f5527b1842f838c4623013fe /lib/sqlalchemy/engine/default.py | |
| parent | bc351a2dc423987f05f4bf88db4987be507ee0a1 (diff) | |
| download | sqlalchemy-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.py | 19 |
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) |
