Commit 499a745a authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #20474 -- Proxied and deprecated django.db.backend

parent a46a3995
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ from django.db.utils import (DEFAULT_DB_ALIAS,
    ProgrammingError, NotSupportedError, DatabaseError,
    InterfaceError, Error,
    load_backend, ConnectionHandler, ConnectionRouter)
from django.utils.functional import cached_property

__all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError',
    'IntegrityError', 'DEFAULT_DB_ALIAS')
@@ -45,7 +46,28 @@ class DefaultConnectionProxy(object):
        return delattr(connections[DEFAULT_DB_ALIAS], name)

connection = DefaultConnectionProxy()
backend = load_backend(connection.settings_dict['ENGINE'])

class DefaultBackendProxy(object):
    """
    Temporary proxy class used during deprecation period of the `backend` module
    variable.
    """
    @cached_property
    def _backend(self):
        warnings.warn("Accessing django.db.backend is deprecated.",
            PendingDeprecationWarning, stacklevel=2)
        return load_backend(connections[DEFAULT_DB_ALIAS].settings_dict['ENGINE'])

    def __getattr__(self, item):
        return getattr(self._backend, item)

    def __setattr__(self, name, value):
        return setattr(self._backend, name, value)

    def __delattr__(self, name):
        return delattr(self._backend, name)

backend = DefaultBackendProxy()

def close_connection(**kwargs):
    warnings.warn(
+1 −0
Original line number Diff line number Diff line
@@ -373,6 +373,7 @@ these changes.

* The following private APIs will be removed:

  - ``django.db.backend``
  - ``django.db.close_connection()``
  - ``django.db.backends.creation.BaseDatabaseCreation.set_autocommit()``
  - ``django.db.transaction.is_managed()``
+6 −3
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ import threading

from django.conf import settings
from django.core.management.color import no_style
from django.db import (backend, connection, connections, DEFAULT_DB_ALIAS,
from django.db import (connection, connections, DEFAULT_DB_ALIAS,
    DatabaseError, IntegrityError, transaction)
from django.db.backends.signals import connection_created
from django.db.backends.postgresql_psycopg2 import version as pg_version
@@ -50,7 +50,8 @@ class OracleChecks(unittest.TestCase):
    def test_dbms_session(self):
        # If the backend is Oracle, test that we can call a standard
        # stored procedure through our cursor wrapper.
        convert_unicode = backend.convert_unicode
        from django.db.backends.oracle.base import convert_unicode

        cursor = connection.cursor()
        cursor.callproc(convert_unicode('DBMS_SESSION.SET_IDENTIFIER'),
                        [convert_unicode('_django_testing!')])
@@ -60,8 +61,10 @@ class OracleChecks(unittest.TestCase):
    def test_cursor_var(self):
        # If the backend is Oracle, test that we can pass cursor variables
        # as query parameters.
        from django.db.backends.oracle.base import Database

        cursor = connection.cursor()
        var = cursor.var(backend.Database.STRING)
        var = cursor.var(Database.STRING)
        cursor.execute("BEGIN %s := 'X'; END; ", [var])
        self.assertEqual(var.getvalue(), 'X')