Added BaseDatabaseWrapper.ensure_connection.

This API is useful because autocommit cannot be managed without an open
connection.
This commit is contained in:
Aymeric Augustin 2013-03-03 15:43:24 +01:00
parent 7b4815b455
commit 1617557ae3
2 changed files with 24 additions and 14 deletions

View File

@ -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

View File

@ -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)