]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- don't call get_lastrowid() on explicit returning
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 4 Oct 2012 21:36:02 +0000 (17:36 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 4 Oct 2012 21:36:02 +0000 (17:36 -0400)
- don't hardwire "subqueries" requirement in the base, mysql < 4.1 isn't working anyway
- don't need explicit FB/PG exclusions in test_returning
- hit db.connect() for the returning requirement

lib/sqlalchemy/engine/default.py
lib/sqlalchemy/testing/assertions.py
lib/sqlalchemy/testing/fixtures.py
lib/sqlalchemy/testing/requirements.py
test/sql/test_returning.py

index 4bb2427c7da055db6becae083ae4f9b3906a8185..778ec6be6135998609d5be8761504e4b3ba53bd5 100644 (file)
@@ -671,6 +671,7 @@ class DefaultExecutionContext(interfaces.ExecutionContext):
 
     def post_insert(self):
         if not self._is_implicit_returning and \
+            not self._is_explicit_returning and \
             not self.compiled.inline and \
             self.dialect.postfetch_lastrowid and \
             (not self.inserted_primary_key or \
index 1e8559c1aae25148d63215910bd28492abb967b3..2b305b98a62a3383b968cadfb212827f780705cc 100644 (file)
@@ -2,7 +2,7 @@ from __future__ import absolute_import
 
 from . import util as testutil
 from sqlalchemy import pool, orm, util
-from sqlalchemy.engine import default
+from sqlalchemy.engine import default, create_engine
 from sqlalchemy import exc as sa_exc
 from sqlalchemy.util import decorator
 from sqlalchemy import types as sqltypes, schema
@@ -183,6 +183,8 @@ class AssertsCompiledSQL(object):
                 dialect = default.DefaultDialect()
             elif dialect is None:
                 dialect = config.db.dialect
+            elif isinstance(dialect, basestring):
+                dialect = create_engine("%s://" % dialect).dialect
 
         kw = {}
         if params is not None:
index 018276d4d7da43a11aaeefe7b6ab309e108ba633..1a1204898cc48f1724d7b3c3ba8c51711a2acbeb 100644 (file)
@@ -202,7 +202,6 @@ class TablesTest(TestBase):
 
 
 class _ORMTest(object):
-    __requires__ = ('subqueries',)
 
     @classmethod
     def teardown_class(cls):
index 4df2163b7d062c71b9bfd6c232be7377d14e5d4e..fa617025fa33be75e3c07ce93af0f4d341c1d025 100644 (file)
@@ -54,6 +54,12 @@ class SuiteRequirements(Requirements):
 
         return exclusions.open()
 
+    @property
+    def subqueries(self):
+        """Target database must support subqueries."""
+
+        return exclusions.open()
+
     @property
     def autoincrement_insert(self):
         """target platform generates new surrogate integer primary key values
@@ -65,6 +71,7 @@ class SuiteRequirements(Requirements):
     def returning(self):
         """target platform supports RETURNING."""
 
+        self.config.db.connect()
         return exclusions.only_if(
                 lambda: self.config.db.dialect.implicit_returning,
                 "'returning' not supported by database"
index 55f4f792689d598b1a49b1e15071f690746ad40b..013f5cfaaa95cabfcc18527243c65504a8141d85 100644 (file)
@@ -3,7 +3,9 @@ from sqlalchemy import *
 from sqlalchemy import testing
 from sqlalchemy.testing.schema import Table, Column
 from sqlalchemy.types import TypeDecorator
-from sqlalchemy.testing import fixtures, AssertsExecutionResults, engines
+from sqlalchemy.testing import fixtures, AssertsExecutionResults, engines, \
+        assert_raises_message
+from sqlalchemy import exc as sa_exc
 
 class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
     __requires__ = 'returning',
@@ -36,8 +38,6 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
     def teardown(self):
         table.drop()
 
-    @testing.exclude('firebird', '<', (2, 0), '2.0+ feature')
-    @testing.exclude('postgresql', '<', (8, 2), '8.2+ feature')
     def test_column_targeting(self):
         result = table.insert().returning(table.c.id, table.c.full).execute({'persons': 1, 'full': False})
 
@@ -55,8 +55,6 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
         eq_(row['goofy'], "FOOsomegoofyBAR")
 
     @testing.fails_on('firebird', "fb can't handle returning x AS y")
-    @testing.exclude('firebird', '<', (2, 0), '2.0+ feature')
-    @testing.exclude('postgresql', '<', (8, 2), '8.2+ feature')
     def test_labeling(self):
         result = table.insert().values(persons=6).\
                             returning(table.c.persons.label('lala')).execute()
@@ -65,8 +63,6 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
 
     @testing.fails_on('firebird', "fb/kintersbasdb can't handle the bind params")
     @testing.fails_on('oracle+zxjdbc', "JDBC driver bug")
-    @testing.exclude('firebird', '<', (2, 0), '2.0+ feature')
-    @testing.exclude('postgresql', '<', (8, 2), '8.2+ feature')
     def test_anon_expressions(self):
         result = table.insert().values(goofy="someOTHERgoofy").\
                             returning(func.lower(table.c.goofy, type_=GoofyType)).execute()
@@ -78,8 +74,6 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
         row = result.first()
         eq_(row[0], 30)
 
-    @testing.exclude('firebird', '<', (2, 1), '2.1+ feature')
-    @testing.exclude('postgresql', '<', (8, 2), '8.2+ feature')
     def test_update_returning(self):
         table.insert().execute([{'persons': 5, 'full': False}, {'persons': 3, 'full': False}])
 
@@ -87,10 +81,8 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
         eq_(result.fetchall(), [(1,)])
 
         result2 = select([table.c.id, table.c.full]).order_by(table.c.id).execute()
-        eq_(result2.fetchall(), [(1,True),(2,False)])
+        eq_(result2.fetchall(), [(1, True), (2, False)])
 
-    @testing.exclude('firebird', '<', (2, 0), '2.0+ feature')
-    @testing.exclude('postgresql', '<', (8, 2), '8.2+ feature')
     def test_insert_returning(self):
         result = table.insert().returning(table.c.id).execute({'persons': 1, 'full': False})
 
@@ -116,10 +108,17 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
 
         test_executemany()
 
+    def test_no_ipk_on_returning(self):
+        result = testing.db.execute(
+                    table.insert().returning(table.c.id),
+                    {'persons': 1, 'full': False}
+                )
+        assert_raises_message(
+            sa_exc.InvalidRequestError,
+            "Can't call inserted_primary_key when returning\(\) is used.",
+            getattr, result, "inserted_primary_key"
+        )
 
-
-    @testing.exclude('firebird', '<', (2, 1), '2.1+ feature')
-    @testing.exclude('postgresql', '<', (8, 2), '8.2+ feature')
     @testing.fails_on_everything_except('postgresql', 'firebird')
     def test_literal_returning(self):
         if testing.against("postgresql"):
@@ -131,8 +130,6 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
                                         'values (5, 10, %s) returning persons' % literal_true)
         eq_([dict(row) for row in result4], [{'persons': 10}])
 
-    @testing.exclude('firebird', '<', (2, 1), '2.1+ feature')
-    @testing.exclude('postgresql', '<', (8, 2), '8.2+ feature')
     def test_delete_returning(self):
         table.insert().execute([{'persons': 5, 'full': False}, {'persons': 3, 'full': False}])
 
@@ -140,7 +137,7 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
         eq_(result.fetchall(), [(1,)])
 
         result2 = select([table.c.id, table.c.full]).order_by(table.c.id).execute()
-        eq_(result2.fetchall(), [(2,False),])
+        eq_(result2.fetchall(), [(2, False),])
 
 class SequenceReturningTest(fixtures.TestBase):
     __requires__ = 'returning', 'sequences'