mirror of
https://github.com/django/django.git
synced 2025-10-29 00:26:07 +00:00
[1.8.x] Fixed #24791 -- Added fallback when 'postgres' database isn't available
Thanks Carl Meyer and Tim Graham for the reviews.
Backport of 322605035 from master.
This commit is contained in:
@@ -514,7 +514,7 @@ class BaseDatabaseCreation(object):
|
||||
# ourselves. Connect to the previous database (not the test database)
|
||||
# to do so, because it's not allowed to delete a database while being
|
||||
# connected to it.
|
||||
with self._nodb_connection.cursor() as cursor:
|
||||
with self.connection._nodb_connection.cursor() as cursor:
|
||||
# Wait to avoid "database is being accessed by other users" errors.
|
||||
time.sleep(1)
|
||||
cursor.execute("DROP DATABASE %s"
|
||||
|
||||
@@ -4,10 +4,14 @@ PostgreSQL database backend for Django.
|
||||
Requires psycopg 2: http://initd.org/projects/psycopg2
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.db import DEFAULT_DB_ALIAS
|
||||
from django.db.backends.base.base import BaseDatabaseWrapper
|
||||
from django.db.backends.base.validation import BaseDatabaseValidation
|
||||
from django.db.utils import DatabaseError as WrappedDatabaseError
|
||||
from django.utils.encoding import force_str
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.safestring import SafeBytes, SafeText
|
||||
@@ -230,6 +234,28 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
||||
else:
|
||||
return True
|
||||
|
||||
@cached_property
|
||||
def _nodb_connection(self):
|
||||
nodb_connection = super(DatabaseWrapper, self)._nodb_connection
|
||||
try:
|
||||
nodb_connection.ensure_connection()
|
||||
except (DatabaseError, WrappedDatabaseError):
|
||||
warnings.warn(
|
||||
"Normally Django will use a connection to the 'postgres' database "
|
||||
"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.",
|
||||
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)
|
||||
return nodb_connection
|
||||
|
||||
@cached_property
|
||||
def psycopg2_version(self):
|
||||
return PSYCOPG2_VERSION
|
||||
|
||||
Reference in New Issue
Block a user