summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
Diffstat (limited to 'django')
-rw-r--r--django/db/backends/creation.py29
-rw-r--r--django/db/backends/oracle/creation.py3
-rw-r--r--django/db/backends/postgresql_psycopg2/creation.py8
-rw-r--r--django/db/backends/sqlite3/creation.py3
4 files changed, 32 insertions, 11 deletions
diff --git a/django/db/backends/creation.py b/django/db/backends/creation.py
index 437a4297af..8cfca3b850 100644
--- a/django/db/backends/creation.py
+++ b/django/db/backends/creation.py
@@ -247,7 +247,7 @@ class BaseDatabaseCreation(object):
verbosity=max(verbosity - 1, 0),
interactive=False,
database=self.connection.alias)
-
+
# One effect of calling syncdb followed by flush is that the id of the
# default site may or may not be 1, depending on how the sequence was
# reset. If the sites app is loaded, then we coerce it.
@@ -294,7 +294,7 @@ class BaseDatabaseCreation(object):
# if the database supports it because PostgreSQL doesn't allow
# CREATE/DROP DATABASE statements within transactions.
cursor = self.connection.cursor()
- self.set_autocommit()
+ self._prepare_for_test_db_ddl()
try:
cursor.execute("CREATE DATABASE %s %s" % (qn(test_database_name), suffix))
except Exception, e:
@@ -339,20 +339,27 @@ class BaseDatabaseCreation(object):
# to do so, because it's not allowed to delete a database while being
# connected to it.
cursor = self.connection.cursor()
- self.set_autocommit()
+ self._prepare_for_test_db_ddl()
time.sleep(1) # To avoid "database is being accessed by other users" errors.
cursor.execute("DROP DATABASE %s" % self.connection.ops.quote_name(test_database_name))
self.connection.close()
def set_autocommit(self):
- "Make sure a connection is in autocommit mode."
- if hasattr(self.connection.connection, "autocommit"):
- if callable(self.connection.connection.autocommit):
- self.connection.connection.autocommit(True)
- else:
- self.connection.connection.autocommit = True
- elif hasattr(self.connection.connection, "set_isolation_level"):
- self.connection.connection.set_isolation_level(0)
+ """
+ Make sure a connection is in autocommit mode. - Deprecated, not used
+ anymore by Django code. Kept for compatibility with user code that
+ might use it.
+ """
+ pass
+
+ def _prepare_for_test_db_ddl(self):
+ """
+ Internal implementation - Hook for tasks that should be performed before
+ the ``CREATE DATABASE``/``DROP DATABASE`` clauses used by testing code
+ to create/ destroy test databases. Needed e.g. in PostgreSQL to rollback
+ and close any active transaction.
+ """
+ pass
def sql_table_creation_suffix(self):
"SQL to append to the end of the test table creation statements"
diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py
index 0403e0a145..1e95a89f1e 100644
--- a/django/db/backends/oracle/creation.py
+++ b/django/db/backends/oracle/creation.py
@@ -270,3 +270,6 @@ class DatabaseCreation(BaseDatabaseCreation):
settings_dict['NAME'],
self._test_database_user(),
)
+
+ def set_autocommit(self):
+ self.connection.connection.autocommit = True
diff --git a/django/db/backends/postgresql_psycopg2/creation.py b/django/db/backends/postgresql_psycopg2/creation.py
index bdd817db4c..1f5609a158 100644
--- a/django/db/backends/postgresql_psycopg2/creation.py
+++ b/django/db/backends/postgresql_psycopg2/creation.py
@@ -76,3 +76,11 @@ class DatabaseCreation(BaseDatabaseCreation):
else:
output = []
return output
+
+ def set_autocommit(self):
+ self._prepare_for_test_db_ddl()
+
+ def _prepare_for_test_db_ddl(self):
+ """Rollback and close the active transaction."""
+ self.connection.connection.rollback()
+ self.connection.connection.set_isolation_level(0)
diff --git a/django/db/backends/sqlite3/creation.py b/django/db/backends/sqlite3/creation.py
index f6fe6a4534..cd393561d1 100644
--- a/django/db/backends/sqlite3/creation.py
+++ b/django/db/backends/sqlite3/creation.py
@@ -69,3 +69,6 @@ class DatabaseCreation(BaseDatabaseCreation):
if test_database_name and test_database_name != ":memory:":
# Remove the SQLite database file
os.remove(test_database_name)
+
+ def set_autocommit(self):
+ self.connection.connection.isolation_level = None