diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index 3537270897..025981c1e5 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -149,6 +149,12 @@ class DatabaseWrapper(BaseDatabaseWrapper): raise ImproperlyConfigured( "settings.DATABASES is improperly configured. " "Please supply the NAME value.") + if len(settings_dict['NAME'] or '') > self.ops.max_name_length(): + raise ImproperlyConfigured( + 'Database names longer than %d characters are not supported by ' + 'PostgreSQL. Supply a shorter NAME in settings.DATABASES.' + % self.ops.max_name_length() + ) conn_params = { 'database': settings_dict['NAME'] or 'postgres', **settings_dict['OPTIONS'], diff --git a/tests/backends/postgresql/tests.py b/tests/backends/postgresql/tests.py index 43bd28eae9..33047df83b 100644 --- a/tests/backends/postgresql/tests.py +++ b/tests/backends/postgresql/tests.py @@ -2,6 +2,7 @@ import unittest import warnings from unittest import mock +from django.core.exceptions import ImproperlyConfigured from django.db import DatabaseError, connection, connections from django.test import TestCase @@ -39,6 +40,18 @@ class Tests(TestCase): self.assertEqual(len(w), 1) self.assertEqual(w[0].message.__class__, RuntimeWarning) + def test_database_name_too_long(self): + from django.db.backends.postgresql.base import DatabaseWrapper + settings = connection.settings_dict.copy() + max_name_length = connection.ops.max_name_length() + settings['NAME'] = 'a' + (max_name_length * 'a') + msg = ( + 'Database names longer than %d characters are not supported by ' + 'PostgreSQL. Supply a shorter NAME in settings.DATABASES.' + ) % max_name_length + with self.assertRaisesMessage(ImproperlyConfigured, msg): + DatabaseWrapper(settings).get_connection_params() + def test_connect_and_rollback(self): """ PostgreSQL shouldn't roll back SET TIME ZONE, even if the first