diff -uprN Django-1.3-vanilla/django/db/backends/creation.py Django-1.3/django/db/backends/creation.py --- django/db/backends/creation.py 2011-02-02 12:02:14.000000000 -0200 +++ django/db/backends/creation.py 2011-07-16 20:21:28.000000000 -0300 @@ -413,7 +413,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: @@ -458,20 +458,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 -uprN Django-1.3-vanilla/django/db/backends/oracle/creation.py Django-1.3/django/db/backends/oracle/creation.py --- django/db/backends/oracle/creation.py 2011-02-19 05:41:17.000000000 -0200 +++ django/db/backends/oracle/creation.py 2011-07-16 20:32:14.000000000 -0300 @@ -269,3 +269,6 @@ class DatabaseCreation(BaseDatabaseCreat settings_dict['NAME'], self._test_database_user(), ) + + def set_autocommit(self): + self.connection.connection.autocommit = True diff -uprN Django-1.3-vanilla/django/db/backends/postgresql/creation.py Django-1.3/django/db/backends/postgresql/creation.py --- django/db/backends/postgresql/creation.py 2010-07-29 23:54:47.000000000 -0300 +++ django/db/backends/postgresql/creation.py 2011-07-16 20:28:39.000000000 -0300 @@ -74,3 +74,11 @@ class DatabaseCreation(BaseDatabaseCreat 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 -uprN Django-1.3-vanilla/django/db/backends/sqlite3/creation.py Django-1.3/django/db/backends/sqlite3/creation.py --- django/db/backends/sqlite3/creation.py 2010-12-08 21:48:28.000000000 -0200 +++ django/db/backends/sqlite3/creation.py 2011-07-16 20:28:57.000000000 -0300 @@ -68,3 +68,6 @@ class DatabaseCreation(BaseDatabaseCreat 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