From 666d3ffa05090f17f0beb1f1ff581a3d9675aac2 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 3 Aug 2009 01:22:42 +0000 Subject: [PATCH] some refinements. would like to try tackling _get_colparams --- lib/sqlalchemy/dialects/mssql/base.py | 2 +- lib/sqlalchemy/engine/base.py | 18 +++++++++--------- lib/sqlalchemy/engine/default.py | 23 ++++++++++++----------- test/dialect/test_postgresql.py | 2 +- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index f52e011d17..83eff3fba5 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -864,7 +864,7 @@ class MSExecutionContext(default.DefaultExecutionContext): if (self.isinsert or self.isupdate or self.isdelete) and self.compiled.returning: self._result_proxy = base.FullyBufferedResultProxy(self) - + if self._enable_identity_insert: self.cursor.execute("SET IDENTITY_INSERT %s OFF" % self.dialect.identifier_preparer.format_table(self.compiled.statement.table)) diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index a48f650508..2606057632 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -1063,6 +1063,7 @@ class Connection(Connectable): def __execute_context(self, context): if context.compiled: context.pre_exec() + if context.executemany: self._cursor_executemany(context.cursor, context.statement, context.parameters, context=context) else: @@ -1652,21 +1653,20 @@ class ResultProxy(object): return self.cursor.description def _autoclose(self): - if self._metadata is None: + if self.context.isinsert: + if self.context._is_implicit_returning: + self.context._fetch_implicit_returning(self) + self.close() + elif not self.context._is_explicit_returning: + self.close() + elif self._metadata is None: # no results, get rowcount # (which requires open cursor on some DB's such as firebird), self.rowcount self.close() # autoclose - elif self.context.isinsert and \ - not self.context.executemany and \ - not self.context._is_explicit_returning: - # an insert, no explicit returning(), may need - # to fetch rows which were created via implicit - # returning, then close - self.context._fetch_implicit_returning(self) - self.close() return self + def _init_metadata(self): self._metadata = metadata = self._cursor_description() diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index ac4dc278ce..3e13236940 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -267,7 +267,13 @@ class DefaultExecutionContext(base.ExecutionContext): def _is_explicit_returning(self): return self.compiled and \ getattr(self.compiled.statement, '_returning', False) - + + @util.memoized_property + def _is_implicit_returning(self): + return self.compiled and \ + bool(self.compiled.returning) and \ + not self.compiled.statement._returning + @property def connection(self): return self._connection._branch() @@ -399,17 +405,12 @@ class DefaultExecutionContext(base.ExecutionContext): ] def _fetch_implicit_returning(self, resultproxy): - - if self.dialect.implicit_returning and \ - not self.compiled.statement._returning and \ - not resultproxy.closed: - - table = self.compiled.statement.table - row = resultproxy.first() + table = self.compiled.statement.table + row = resultproxy.first() - self._inserted_primary_key = [v is not None and v or row[c] - for c, v in zip(table.primary_key, self._inserted_primary_key) - ] + self._inserted_primary_key = [v is not None and v or row[c] + for c, v in zip(table.primary_key, self._inserted_primary_key) + ] def last_inserted_params(self): return self._last_inserted_params diff --git a/test/dialect/test_postgresql.py b/test/dialect/test_postgresql.py index f78bf83f43..e1c351a93e 100644 --- a/test/dialect/test_postgresql.py +++ b/test/dialect/test_postgresql.py @@ -127,7 +127,7 @@ class InsertTest(TestBase, AssertsExecutionResults): metadata.create_all() - ins = table.insert(values={'data':bindparam('x')}).compile() + ins = table.insert(inline=True, values={'data':bindparam('x')}).compile() ins.execute({'x':"five"}, {'x':"seven"}) assert table.select().execute().fetchall() == [(1, 'five'), (2, 'seven')] -- 2.47.3