Commit 2a97db33 authored by Aymeric Augustin's avatar Aymeric Augustin Committed by Tim Graham
Browse files

[1.7.x] Avoided transactional DDL on castrated databases.

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

Refs #22308 and #23089.

Backport of 0757e0f3 from master
parent 5ca82ff7
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ from django.core import management
from django.core.cache import (cache, caches, CacheKeyWarning,
    InvalidCacheBackendError, DEFAULT_CACHE_ALIAS)
from django.core.context_processors import csrf
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,
@@ -989,11 +989,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)