diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-09-01 19:49:26 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-09-01 19:49:26 +0000 |
commit | 69f7084c9b79b0b70f2b24400fb150a0a40d0424 (patch) | |
tree | 1da7f3a6b0a873472b57ad0e093339be6cff0b48 /lib/sqlalchemy/engine/base.py | |
parent | 15ab87994ced6f27e0403ce16fd7ffada31e6858 (diff) | |
download | sqlalchemy-69f7084c9b79b0b70f2b24400fb150a0a40d0424.tar.gz |
- merged inline inserts branch
- all executemany() style calls put all sequences and SQL defaults inline into a single SQL statement
and don't do any pre-execution
- regular Insert and Update objects can have inline=True, forcing all executions to be inlined.
- no last_inserted_ids(), lastrow_has_defaults() available with inline execution
- calculation of pre/post execute pushed into compiler; DefaultExecutionContext greatly simplified
- fixed postgres reflection of primary key columns with no sequence/default generator, sets autoincrement=False
- fixed postgres executemany() behavior regarding sequences present, not present, passivedefaults, etc.
- all tests pass for sqlite, mysql, postgres; oracle tests pass as well as they did previously including all
insert/update/default functionality
Diffstat (limited to 'lib/sqlalchemy/engine/base.py')
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 496af751b..6f3badb44 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -75,6 +75,10 @@ class Dialect(object): supports_sane_rowcount Indicate whether the dialect properly implements rowcount for ``UPDATE`` and ``DELETE`` statements. + supports_sane_multi_rowcount + Indicate whether the dialect properly implements rowcount for ``UPDATE`` and ``DELETE`` statements + when executed via executemany. + """ def create_connect_args(self, url): @@ -677,7 +681,7 @@ class Connection(Connectable): try: self.__engine.dialect.do_begin(self.connection) except Exception, e: - raise exceptions.SQLError(None, None, e) + raise exceptions.DBAPIError.instance(None, None, e) def _rollback_impl(self): if self.__connection.is_valid: @@ -686,7 +690,7 @@ class Connection(Connectable): try: self.__engine.dialect.do_rollback(self.connection) except Exception, e: - raise exceptions.SQLError(None, None, e) + raise exceptions.DBAPIError.instance(None, None, e) self.__transaction = None def _commit_impl(self): @@ -696,7 +700,7 @@ class Connection(Connectable): try: self.__engine.dialect.do_commit(self.connection) except Exception, e: - raise exceptions.SQLError(None, None, e) + raise exceptions.DBAPIError.instance(None, None, e) self.__transaction = None def _savepoint_impl(self, name=None): @@ -807,12 +811,13 @@ class Connection(Connectable): return self._execute_clauseelement(func.select(), multiparams, params) def _execute_clauseelement(self, elem, multiparams=None, params=None): - executemany = multiparams is not None and len(multiparams) > 0 - if executemany: + if multiparams: param = multiparams[0] + executemany = len(multiparams) > 1 else: param = params - return self._execute_compiled(elem.compile(dialect=self.dialect, parameters=param), multiparams, params) + executemany = False + return self._execute_compiled(elem.compile(dialect=self.dialect, parameters=param, inline=executemany), multiparams, params) def _execute_compiled(self, compiled, multiparams=None, params=None): """Execute a sql.Compiled object.""" @@ -856,7 +861,7 @@ class Connection(Connectable): self._autorollback() if self.__close_with_result: self.close() - raise exceptions.SQLError(context.statement, context.parameters, e) + raise exceptions.DBAPIError.instance(context.statement, context.parameters, e) def __executemany(self, context): try: @@ -869,7 +874,7 @@ class Connection(Connectable): self._autorollback() if self.__close_with_result: self.close() - raise exceptions.SQLError(context.statement, context.parameters, e) + raise exceptions.DBAPIError.instance(context.statement, context.parameters, e) # poor man's multimethod/generic function thingy executors = { @@ -1346,12 +1351,16 @@ class ResultProxy(object): return self.context.lastrow_has_defaults() def supports_sane_rowcount(self): - """Return ``supports_sane_rowcount()`` from the underlying ExecutionContext. + """Return ``supports_sane_rowcount`` from the dialect. - See ExecutionContext for details. + """ + return self.dialect.supports_sane_rowcount + + def supports_sane_multi_rowcount(self): + """Return ``supports_sane_multi_rowcount`` from the dialect. """ - return self.context.supports_sane_rowcount() + return self.dialect.supports_sane_multi_rowcount def _get_col(self, row, key): rec = self._key_cache[key] |