Delayed settings.DATABASES usage by ConnectionHandler

Refs #20474.
This commit is contained in:
Claude Paroz 2013-05-21 11:35:05 +02:00
parent 499a745ae1
commit 2d8c132b18
2 changed files with 19 additions and 12 deletions

View File

@ -2,7 +2,6 @@ import warnings
from django.conf import settings from django.conf import settings
from django.core import signals from django.core import signals
from django.core.exceptions import ImproperlyConfigured
from django.db.utils import (DEFAULT_DB_ALIAS, from django.db.utils import (DEFAULT_DB_ALIAS,
DataError, OperationalError, IntegrityError, InternalError, DataError, OperationalError, IntegrityError, InternalError,
ProgrammingError, NotSupportedError, DatabaseError, ProgrammingError, NotSupportedError, DatabaseError,
@ -13,11 +12,7 @@ from django.utils.functional import cached_property
__all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError', __all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError',
'IntegrityError', 'DEFAULT_DB_ALIAS') 'IntegrityError', 'DEFAULT_DB_ALIAS')
connections = ConnectionHandler()
if settings.DATABASES and DEFAULT_DB_ALIAS not in settings.DATABASES:
raise ImproperlyConfigured("You must define a '%s' database" % DEFAULT_DB_ALIAS)
connections = ConnectionHandler(settings.DATABASES)
router = ConnectionRouter(settings.DATABASE_ROUTERS) router = ConnectionRouter(settings.DATABASE_ROUTERS)

View File

@ -6,6 +6,7 @@ import warnings
from django.conf import settings from django.conf import settings
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.utils.functional import cached_property
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.module_loading import import_by_path from django.utils.module_loading import import_by_path
from django.utils._os import upath from django.utils._os import upath
@ -138,16 +139,27 @@ class ConnectionDoesNotExist(Exception):
class ConnectionHandler(object): class ConnectionHandler(object):
def __init__(self, databases): def __init__(self, databases=None):
if not databases: """
self.databases = { databases is an optional dictionary of database definitions (structured
like settings.DATABASES).
"""
self._databases = databases
self._connections = local()
@cached_property
def databases(self):
if self._databases is None:
self._databases = settings.DATABASES
if self._databases == {}:
self._databases = {
DEFAULT_DB_ALIAS: { DEFAULT_DB_ALIAS: {
'ENGINE': 'django.db.backends.dummy', 'ENGINE': 'django.db.backends.dummy',
}, },
} }
else: if DEFAULT_DB_ALIAS not in self._databases:
self.databases = databases raise ImproperlyConfigured("You must define a '%s' database" % DEFAULT_DB_ALIAS)
self._connections = local() return self._databases
def ensure_defaults(self, alias): def ensure_defaults(self, alias):
""" """