diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index 0c060e57eb..3537270897 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -9,7 +9,7 @@ import warnings from django.conf import settings from django.core.exceptions import ImproperlyConfigured -from django.db import DEFAULT_DB_ALIAS +from django.db import connections from django.db.backends.base.base import BaseDatabaseWrapper from django.db.utils import DatabaseError as WrappedDatabaseError from django.utils.functional import cached_property @@ -255,16 +255,16 @@ class DatabaseWrapper(BaseDatabaseWrapper): "to avoid running initialization queries against the production " "database when it's not needed (for example, when running tests). " "Django was unable to create a connection to the 'postgres' database " - "and will use the default database instead.", + "and will use the first PostgreSQL database instead.", RuntimeWarning ) - settings_dict = self.settings_dict.copy() - settings_dict['NAME'] = settings.DATABASES[DEFAULT_DB_ALIAS]['NAME'] - nodb_connection = self.__class__( - self.settings_dict.copy(), - alias=self.alias, - allow_thread_sharing=False, - ) + for connection in connections.all(): + if connection.vendor == 'postgresql' and connection.settings_dict['NAME'] != 'postgres': + return self.__class__( + {**self.settings_dict, 'NAME': connection.settings_dict['NAME']}, + alias=self.alias, + allow_thread_sharing=False, + ) return nodb_connection @cached_property diff --git a/tests/backends/postgresql/tests.py b/tests/backends/postgresql/tests.py index c4810c0960..43bd28eae9 100644 --- a/tests/backends/postgresql/tests.py +++ b/tests/backends/postgresql/tests.py @@ -2,7 +2,7 @@ import unittest import warnings from unittest import mock -from django.db import DatabaseError, connection +from django.db import DatabaseError, connection, connections from django.test import TestCase @@ -26,10 +26,15 @@ class Tests(TestCase): with warnings.catch_warnings(record=True) as w: with mock.patch('django.db.backends.base.base.BaseDatabaseWrapper.connect', side_effect=mocked_connect, autospec=True): - warnings.simplefilter('always', RuntimeWarning) - nodb_conn = connection._nodb_connection + with mock.patch.object( + connection, + 'settings_dict', + {**connection.settings_dict, 'NAME': 'postgres'}, + ): + warnings.simplefilter('always', RuntimeWarning) + nodb_conn = connection._nodb_connection self.assertIsNotNone(nodb_conn.settings_dict['NAME']) - self.assertEqual(nodb_conn.settings_dict['NAME'], connection.settings_dict['NAME']) + self.assertEqual(nodb_conn.settings_dict['NAME'], connections['other'].settings_dict['NAME']) # Check a RuntimeWarning has been emitted self.assertEqual(len(w), 1) self.assertEqual(w[0].message.__class__, RuntimeWarning)