mirror of
https://github.com/django/django.git
synced 2025-06-05 03:29:12 +00:00
[1.4.x] Removed try-except in django.db.close_connection()
The reason was that the except clause needed to remove a connection from the django.db.connections dict, but other parts of Django do not expect this to happen. In addition the except clause was silently swallowing the exception messages. Refs #19707, special thanks to Carl Meyer for pointing out that this approach should be taken.
This commit is contained in:
parent
b4fb448f83
commit
dec7dd99f0
@ -45,14 +45,11 @@ def close_connection(**kwargs):
|
|||||||
# Avoid circular imports
|
# Avoid circular imports
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
for conn in connections:
|
for conn in connections:
|
||||||
try:
|
# If an error happens here the connection will be left in broken
|
||||||
transaction.abort(conn)
|
# state. Once a good db connection is again available, the
|
||||||
connections[conn].close()
|
# connection state will be cleaned up.
|
||||||
except Exception:
|
transaction.abort(conn)
|
||||||
# The connection's state is unknown, so it has to be
|
connections[conn].close()
|
||||||
# abandoned. This could happen for example if the network
|
|
||||||
# connection has a failure.
|
|
||||||
del connections[conn]
|
|
||||||
signals.request_finished.connect(close_connection)
|
signals.request_finished.connect(close_connection)
|
||||||
|
|
||||||
# Register an event that resets connection.queries
|
# Register an event that resets connection.queries
|
||||||
|
@ -97,9 +97,6 @@ class ConnectionHandler(object):
|
|||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
setattr(self._connections, key, value)
|
setattr(self._connections, key, value)
|
||||||
|
|
||||||
def __delitem__(self, key):
|
|
||||||
delattr(self._connections, key)
|
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return iter(self.databases)
|
return iter(self.databases)
|
||||||
|
|
||||||
|
@ -559,9 +559,14 @@ class TransactionRequestTests(TransactionTestCase):
|
|||||||
def fail_horribly():
|
def fail_horribly():
|
||||||
raise Exception("Horrible failure!")
|
raise Exception("Horrible failure!")
|
||||||
conn._rollback = fail_horribly
|
conn._rollback = fail_horribly
|
||||||
|
try:
|
||||||
|
with self.assertRaises(Exception):
|
||||||
|
signals.request_finished.send(sender=self.__class__)
|
||||||
|
# The connection's state wasn't cleaned up
|
||||||
|
self.assertTrue(len(connection.transaction_state), 1)
|
||||||
|
finally:
|
||||||
|
del conn._rollback
|
||||||
|
# The connection will be cleaned on next request where the conn
|
||||||
|
# works again.
|
||||||
signals.request_finished.send(sender=self.__class__)
|
signals.request_finished.send(sender=self.__class__)
|
||||||
# As even rollback wasn't possible the connection wrapper itself was
|
|
||||||
# abandoned. Accessing the connections[alias] will create a new
|
|
||||||
# connection wrapper, whch must be different than the original one.
|
|
||||||
self.assertIsNot(conn, connections[DEFAULT_DB_ALIAS])
|
|
||||||
self.assertEqual(len(connection.transaction_state), 0)
|
self.assertEqual(len(connection.transaction_state), 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user