Commit d8744cca authored by Adrian Holovaty's avatar Adrian Holovaty
Browse files

Fixed #10487 -- Refactored the database-backend-selection logic into a...

Fixed #10487 -- Refactored the database-backend-selection logic into a function, django.db.load_backend. Thanks to Alex Gaynor for the initial patch

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10045 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent c3dc8379
Loading
Loading
Loading
Loading
+26 −24
Original line number Diff line number Diff line
@@ -9,17 +9,16 @@ __all__ = ('backend', 'connection', 'DatabaseError', 'IntegrityError')
if not settings.DATABASE_ENGINE:
    settings.DATABASE_ENGINE = 'dummy'

def load_backend(backend_name):
    try:
        # Most of the time, the database backend will be one of the official
        # backends that ships with Django, so look there first.
    _import_path = 'django.db.backends.'
    backend = __import__('%s%s.base' % (_import_path, settings.DATABASE_ENGINE), {}, {}, [''])
        return __import__('django.db.backends.%s.base' % backend_name, {}, {}, [''])
    except ImportError, e:
        # If the import failed, we might be looking for a database backend
        # distributed external to Django. So we'll try that next.
        try:
        _import_path = ''
        backend = __import__('%s.base' % settings.DATABASE_ENGINE, {}, {}, [''])
            return __import__('%s.base' % backend_name, {}, {}, [''])
        except ImportError, e_user:
            # The database backend wasn't found. Display a helpful error message
            # listing all possible (built-in) database backends.
@@ -30,12 +29,15 @@ except ImportError, e:
            except EnvironmentError:
                available_backends = []
            available_backends.sort()
        if settings.DATABASE_ENGINE not in available_backends:
            raise ImproperlyConfigured, "%r isn't an available database backend. Available options are: %s\nError was: %s" % \
                (settings.DATABASE_ENGINE, ", ".join(map(repr, available_backends)), e_user)
            if backend_name not in available_backends:
                error_msg = "%r isn't an available database backend. Available options are: %s\nError was: %s" % \
                    (backend_name, ", ".join(map(repr, available_backends)), e_user)
                raise ImproperlyConfigured(error_msg)
            else:
                raise # If there's some other error, this must be an error in Django itself.

backend = load_backend(settings.DATABASE_ENGINE)

# `connection`, `DatabaseError` and `IntegrityError` are convenient aliases
# for backend bits.