Commits

Anonymous committed 0407a46

Fixed #17047 -- Improved django.db.utils.load_backend to raise a better exception when using a unqualified database backend name. Thanks, Jonas Obrist.

  • Participants
  • Parent commits 77e832d

Comments (0)

Files changed (2)

File django/db/utils.py

                     and not f.startswith('.')]
         except EnvironmentError:
             available_backends = []
-        if backend_name.startswith('django.db.backends.'):
+        full_notation = backend_name.startswith('django.db.backends.')
+        if full_notation:
             backend_name = backend_name[19:] # See #15621.
         if backend_name not in available_backends:
-            error_msg = ("%r isn't an available database backend. \n" +
-                "Try using django.db.backends.XXX, where XXX is one of:\n    %s\n" +
-                "Error was: %s") % \
-                (backend_name, ", ".join(map(repr, sorted(available_backends))), e_user)
+            backend_reprs = map(repr, sorted(available_backends))
+            error_msg = ("%r isn't an available database backend.\n"
+                         "Try using django.db.backends.XXX, where XXX "
+                         "is one of:\n    %s\nError was: %s" %
+                         (backend_name, ", ".join(backend_reprs), e_user))
+            raise ImproperlyConfigured(error_msg)
+        elif not full_notation:
+            # user tried to use the old notation for the database backend
+            error_msg = ("%r isn't an available database backend.\n"
+                         "Try using django.db.backends.%s instead.\n"
+                         "Error was: %s" %
+                         (backend_name, backend_name, e_user))
             raise ImproperlyConfigured(error_msg)
         else:
-            raise # If there's some other error, this must be an error in Django itself.
+            # If there's some other error, this must be an error in Django
+            raise
 
 
 class ConnectionDoesNotExist(Exception):

File tests/regressiontests/backends/tests.py

 
 from django.conf import settings
 from django.core.management.color import no_style
+from django.core.exceptions import ImproperlyConfigured
 from django.db import (backend, connection, connections, DEFAULT_DB_ALIAS,
     IntegrityError, transaction)
 from django.db.backends.signals import connection_created
 from django.db.backends.postgresql_psycopg2 import version as pg_version
-from django.db.utils import ConnectionHandler, DatabaseError
+from django.db.utils import ConnectionHandler, DatabaseError, load_backend
 from django.test import TestCase, skipUnlessDBFeature, TransactionTestCase
 from django.utils import unittest
 
         t1.start()
         t1.join()
         # No exception was raised
-        self.assertEqual(len(exceptions), 0)
+        self.assertEqual(len(exceptions), 0)
+
+
+class BackendLoadingTests(TestCase):
+    def test_old_style_backends_raise_useful_exception(self):
+        self.assertRaisesRegexp(ImproperlyConfigured,
+            "Try using django.db.backends.sqlite3 instead",
+            load_backend, 'sqlite3')