mirror of https://github.com/django/django.git
Added BaseDatabaseWrapper.ensure_connection.
This API is useful because autocommit cannot be managed without an open connection.
This commit is contained in:
parent
7b4815b455
commit
1617557ae3
|
@ -86,20 +86,33 @@ class BaseDatabaseWrapper(object):
|
||||||
"""Creates a cursor. Assumes that a connection is established."""
|
"""Creates a cursor. Assumes that a connection is established."""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
##### Backend-specific methods for creating connections #####
|
||||||
|
|
||||||
|
def connect(self):
|
||||||
|
"""Connects to the database. Assumes that the connection is closed."""
|
||||||
|
# Reset parameters defining when to close the connection
|
||||||
|
max_age = self.settings_dict['CONN_MAX_AGE']
|
||||||
|
self.close_at = None if max_age is None else time.time() + max_age
|
||||||
|
self.errors_occurred = False
|
||||||
|
# Establish the connection
|
||||||
|
conn_params = self.get_connection_params()
|
||||||
|
self.connection = self.get_new_connection(conn_params)
|
||||||
|
self.init_connection_state()
|
||||||
|
connection_created.send(sender=self.__class__, connection=self)
|
||||||
|
|
||||||
|
def ensure_connection(self):
|
||||||
|
"""
|
||||||
|
Guarantees that a connection to the database is established.
|
||||||
|
"""
|
||||||
|
if self.connection is None:
|
||||||
|
with self.wrap_database_errors():
|
||||||
|
self.connect()
|
||||||
|
|
||||||
##### Backend-specific wrappers for PEP-249 connection methods #####
|
##### Backend-specific wrappers for PEP-249 connection methods #####
|
||||||
|
|
||||||
def _cursor(self):
|
def _cursor(self):
|
||||||
|
self.ensure_connection()
|
||||||
with self.wrap_database_errors():
|
with self.wrap_database_errors():
|
||||||
if self.connection is None:
|
|
||||||
# Reset parameters defining when to close the connection
|
|
||||||
max_age = self.settings_dict['CONN_MAX_AGE']
|
|
||||||
self.close_at = None if max_age is None else time.time() + max_age
|
|
||||||
self.errors_occurred = False
|
|
||||||
# Establish the connection
|
|
||||||
conn_params = self.get_connection_params()
|
|
||||||
self.connection = self.get_new_connection(conn_params)
|
|
||||||
self.init_connection_state()
|
|
||||||
connection_created.send(sender=self.__class__, connection=self)
|
|
||||||
return self.create_cursor()
|
return self.create_cursor()
|
||||||
|
|
||||||
def _commit(self):
|
def _commit(self):
|
||||||
|
@ -285,6 +298,7 @@ class BaseDatabaseWrapper(object):
|
||||||
"""
|
"""
|
||||||
Enable or disable autocommit.
|
Enable or disable autocommit.
|
||||||
"""
|
"""
|
||||||
|
self.ensure_connection()
|
||||||
self._set_autocommit(autocommit)
|
self._set_autocommit(autocommit)
|
||||||
self.autocommit = autocommit
|
self.autocommit = autocommit
|
||||||
|
|
||||||
|
|
|
@ -169,8 +169,6 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
||||||
Switch the isolation level when needing transaction support, so that
|
Switch the isolation level when needing transaction support, so that
|
||||||
the same transaction is visible across all the queries.
|
the same transaction is visible across all the queries.
|
||||||
"""
|
"""
|
||||||
if self.connection is None: # Force creating a connection.
|
|
||||||
self.cursor().close()
|
|
||||||
if managed and self.autocommit:
|
if managed and self.autocommit:
|
||||||
self.set_autocommit(False)
|
self.set_autocommit(False)
|
||||||
|
|
||||||
|
@ -179,8 +177,6 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
||||||
If the normal operating mode is "autocommit", switch back to that when
|
If the normal operating mode is "autocommit", switch back to that when
|
||||||
leaving transaction management.
|
leaving transaction management.
|
||||||
"""
|
"""
|
||||||
if self.connection is None: # Force creating a connection.
|
|
||||||
self.cursor().close()
|
|
||||||
if not managed and not self.autocommit:
|
if not managed and not self.autocommit:
|
||||||
self.rollback() # Must terminate transaction first.
|
self.rollback() # Must terminate transaction first.
|
||||||
self.set_autocommit(True)
|
self.set_autocommit(True)
|
||||||
|
|
Loading…
Reference in New Issue