]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
some refinements. would like to try tackling _get_colparams
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 3 Aug 2009 01:22:42 +0000 (01:22 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 3 Aug 2009 01:22:42 +0000 (01:22 +0000)
lib/sqlalchemy/dialects/mssql/base.py
lib/sqlalchemy/engine/base.py
lib/sqlalchemy/engine/default.py
test/dialect/test_postgresql.py

index f52e011d17b709df1123696c3d60ea36e77c0855..83eff3fba522fcf34bc4fbc457e47b58416f2e85 100644 (file)
@@ -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))
         
index a48f650508a73bf2d4f38635083987bd7cfc289b..2606057632a0f37ddd3d88b5d27b9b54acdd96c6 100644 (file)
@@ -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()
index ac4dc278ce57ff9195cc8034393421451fff89fd..3e1323694087df12a8903db707a750d2b391f556 100644 (file)
@@ -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
index f78bf83f4347fa46bc7020bce2e364aefbefde2e..e1c351a93ec50b4553b6ff802c1717cc262ef6c6 100644 (file)
@@ -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')]