diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py index aa8b1f26eed..fe053c54f72 100644 --- a/django/db/backends/oracle/creation.py +++ b/django/db/backends/oracle/creation.py @@ -97,6 +97,8 @@ class DatabaseCreation(BaseDatabaseCreation): print("Tests cancelled.") sys.exit(1) + # Cursor must be closed before closing connection. + cursor.close() self._maindb_connection.close() # done with main user -- test user and tablespaces created self._switch_to_test_user(parameters) return self.connection.settings_dict['NAME'] @@ -182,6 +184,8 @@ class DatabaseCreation(BaseDatabaseCreation): if verbosity >= 1: print('Destroying test database tables...') self._execute_test_db_destruction(cursor, parameters, verbosity) + # Cursor must be closed before closing connection. + cursor.close() self._maindb_connection.close() def _execute_test_db_creation(self, cursor, parameters, verbosity, keepdb=False): diff --git a/docs/releases/1.11.5.txt b/docs/releases/1.11.5.txt index 55fa0eda7e6..556cc737932 100644 --- a/docs/releases/1.11.5.txt +++ b/docs/releases/1.11.5.txt @@ -11,3 +11,5 @@ Bugfixes * Fixed GEOS version parsing if the version has a commit hash at the end (new in GEOS 3.6.2) (:ticket:`28441`). + +* Fixed test database creation with ``cx_Oracle`` 6 (:ticket:`28498`). diff --git a/tests/select_for_update/tests.py b/tests/select_for_update/tests.py index eaedd506de6..707fa0e9ba0 100644 --- a/tests/select_for_update/tests.py +++ b/tests/select_for_update/tests.py @@ -56,6 +56,7 @@ class SelectForUpdateTests(TransactionTestCase): def end_blocking_transaction(self): # Roll back the blocking transaction. + self.cursor.close() self.new_connection.rollback() self.new_connection.set_autocommit(True) @@ -370,7 +371,10 @@ class SelectForUpdateTests(TransactionTestCase): finally: # This method is run in a separate thread. It uses its own # database connection. Close it without waiting for the GC. - connection.close() + # Connection cannot be closed on Oracle because cursor is still + # open. + if connection.vendor != 'oracle': + connection.close() status = [] thread = threading.Thread(target=raw, kwargs={'status': status})