3
3
from django.core import signals
4
from django.db.utils import (DEFAULT_DB_ALIAS,
5
DataError, OperationalError, IntegrityError, InternalError,
6
ProgrammingError, NotSupportedError, DatabaseError,
8
load_backend, ConnectionHandler, ConnectionRouter)
4
from django.db.utils import (DEFAULT_DB_ALIAS, DataError, OperationalError,
5
IntegrityError, InternalError, ProgrammingError, NotSupportedError,
6
DatabaseError, InterfaceError, Error, load_backend,
7
ConnectionHandler, ConnectionRouter)
8
from django.utils.deprecation import RemovedInDjango18Warning
9
9
from django.utils.functional import cached_property
11
__all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError',
12
'IntegrityError', 'DEFAULT_DB_ALIAS')
13
'backend', 'connection', 'connections', 'router', 'DatabaseError',
14
'IntegrityError', 'InternalError', 'ProgrammingError', 'DataError',
15
'NotSupportedError', 'Error', 'InterfaceError', 'OperationalError',
14
19
connections = ConnectionHandler()
16
21
router = ConnectionRouter()
18
24
# `connection`, `DatabaseError` and `IntegrityError` are convenient aliases
19
25
# for backend bits.
39
45
def __delattr__(self, name):
40
46
return delattr(connections[DEFAULT_DB_ALIAS], name)
48
def __eq__(self, other):
49
return connections[DEFAULT_DB_ALIAS] == other
51
def __ne__(self, other):
52
return connections[DEFAULT_DB_ALIAS] != other
42
54
connection = DefaultConnectionProxy()
44
57
class DefaultBackendProxy(object):
46
59
Temporary proxy class used during deprecation period of the `backend` module
50
63
def _backend(self):
51
64
warnings.warn("Accessing django.db.backend is deprecated.",
52
PendingDeprecationWarning, stacklevel=2)
65
RemovedInDjango18Warning, stacklevel=2)
53
66
return load_backend(connections[DEFAULT_DB_ALIAS].settings_dict['ENGINE'])
55
68
def __getattr__(self, item):
64
77
backend = DefaultBackendProxy()
66
80
def close_connection(**kwargs):
68
82
"close_connection is superseded by close_old_connections.",
69
PendingDeprecationWarning, stacklevel=2)
83
RemovedInDjango18Warning, stacklevel=2)
70
84
# Avoid circular imports
71
85
from django.db import transaction
72
86
for conn in connections:
76
90
transaction.abort(conn)
77
91
connections[conn].close()
79
94
# Register an event to reset saved queries when a Django request is started.
80
95
def reset_queries(**kwargs):
81
96
for conn in connections.all():
83
98
signals.request_started.connect(reset_queries)
85
101
# Register an event to reset transaction state and close connections past
86
102
# their lifetime. NB: abort() doesn't do anything outside of a transaction.
87
103
def close_old_connections(**kwargs):