Browse Source

Avoided transactional DDL on castrated databases.

Fixed a test failure that appeared after 753a22a6, although the bug
existed before that commit.

Refs #22308.
Aymeric Augustin 11 years ago
parent
commit
0757e0f30d
2 changed files with 9 additions and 5 deletions
  1. 4 1
      django/core/management/commands/createcachetable.py
  2. 5 4
      tests/cache/tests.py

+ 4 - 1
django/core/management/commands/createcachetable.py

@@ -71,7 +71,9 @@ class Command(BaseCommand):
         for i, line in enumerate(table_output):
             full_statement.append('    %s%s' % (line, ',' if i < len(table_output) - 1 else ''))
         full_statement.append(');')
-        with transaction.atomic(using=database):
+
+        with transaction.atomic(using=database,
+                                savepoint=connection.features.can_rollback_ddl):
             with connection.cursor() as curs:
                 try:
                     curs.execute("\n".join(full_statement))
@@ -81,5 +83,6 @@ class Command(BaseCommand):
                         (tablename, force_text(e)))
                 for statement in index_output:
                     curs.execute(statement)
+
         if self.verbosity > 1:
             self.stdout.write("Cache table '%s' created." % tablename)

+ 5 - 4
tests/cache/tests.py

@@ -18,7 +18,7 @@ from django.conf import settings
 from django.core import management
 from django.core.cache import (cache, caches, CacheKeyWarning,
     InvalidCacheBackendError, DEFAULT_CACHE_ALIAS)
-from django.db import connection, router, transaction
+from django.db import connection, connections, router, transaction
 from django.core.cache.utils import make_template_fragment_key
 from django.http import HttpResponse, StreamingHttpResponse
 from django.middleware.cache import (FetchFromCacheMiddleware,
@@ -981,11 +981,12 @@ class CreateCacheTableForDBCacheTests(TestCase):
             # cache table should be created on 'other'
             # Queries:
             #   1: check table doesn't already exist
-            #   2: create savepoint
+            #   2: create savepoint (if transactional DDL is supported)
             #   3: create the table
             #   4: create the index
-            #   5: release savepoint
-            with self.assertNumQueries(5, using='other'):
+            #   5: release savepoint (if transactional DDL is supported)
+            num = 5 if connections['other'].features.can_rollback_ddl else 3
+            with self.assertNumQueries(num, using='other'):
                 management.call_command('createcachetable',
                                         database='other',
                                         verbosity=0, interactive=False)