Avoided closing the database connection within a transaction.

Refs #9437.
This commit is contained in:
Aymeric Augustin 2013-03-11 21:08:49 +01:00
parent b746f8a9e3
commit f2f98abb95
2 changed files with 7 additions and 13 deletions

View File

@ -402,18 +402,10 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
""" """
Helper routine for calling PostGIS functions and returning their result. Helper routine for calling PostGIS functions and returning their result.
""" """
cursor = self.connection._cursor() # Close out the connection. See #9437.
try: with self.connection.temporary_connection() as cursor:
try: cursor.execute('SELECT %s()' % func)
cursor.execute('SELECT %s()' % func) return cursor.fetchone()[0]
row = cursor.fetchone()
except:
# Responsibility of callers to perform error handling.
raise
finally:
# Close out the connection. See #9437.
self.connection.close()
return row[0]
def postgis_geos_version(self): def postgis_geos_version(self):
"Returns the version of the GEOS library used with PostGIS." "Returns the version of the GEOS library used with PostGIS."

View File

@ -472,11 +472,13 @@ class BaseDatabaseWrapper(object):
Context manager that ensures that a connection is established, and Context manager that ensures that a connection is established, and
if it opened one, closes it to avoid leaving a dangling connection. if it opened one, closes it to avoid leaving a dangling connection.
This is useful for operations outside of the request-response cycle. This is useful for operations outside of the request-response cycle.
Provides a cursor: with self.temporary_connection() as cursor: ...
""" """
must_close = self.connection is None must_close = self.connection is None
cursor = self.cursor() cursor = self.cursor()
try: try:
yield yield cursor
finally: finally:
cursor.close() cursor.close()
if must_close: if must_close: