From 0757e0f30d5ad3731d4a59fe571256369663c2f6 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Sat, 22 Mar 2014 11:02:00 +0100 Subject: [PATCH] Avoided transactional DDL on castrated databases. Fixed a test failure that appeared after 753a22a6, although the bug existed before that commit. Refs #22308. --- django/core/management/commands/createcachetable.py | 5 ++++- tests/cache/tests.py | 9 +++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/django/core/management/commands/createcachetable.py b/django/core/management/commands/createcachetable.py index 8a9d0829c5c..3eb4a840570 100644 --- a/django/core/management/commands/createcachetable.py +++ b/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) diff --git a/tests/cache/tests.py b/tests/cache/tests.py index 285bcfa4ed0..a5a10c68cff 100644 --- a/tests/cache/tests.py +++ b/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)