diff --git a/django/db/backends/base/operations.py b/django/db/backends/base/operations.py index 60de2d6c79..8f2660d928 100644 --- a/django/db/backends/base/operations.py +++ b/django/db/backends/base/operations.py @@ -1,7 +1,6 @@ import datetime import decimal import json -import warnings from importlib import import_module import sqlparse @@ -10,7 +9,6 @@ from django.conf import settings from django.db import NotSupportedError, transaction from django.db.models.expressions import Col from django.utils import timezone -from django.utils.deprecation import RemovedInDjango60Warning from django.utils.encoding import force_str @@ -214,23 +212,6 @@ class BaseDatabaseOperations: """ return cursor.fetchone() - def field_cast_sql(self, db_type, internal_type): - """ - Given a column type (e.g. 'BLOB', 'VARCHAR') and an internal type - (e.g. 'GenericIPAddressField'), return the SQL to cast it before using - it in a WHERE statement. The resulting string should contain a '%s' - placeholder for the column being searched against. - """ - warnings.warn( - ( - "DatabaseOperations.field_cast_sql() is deprecated use " - "DatabaseOperations.lookup_cast() instead." - ), - RemovedInDjango60Warning, - stacklevel=2, - ) - return "%s" - def force_group_by(self): """ Return a GROUP BY clause to use with a HAVING clause when no grouping diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py index 56dbdabac1..860488794c 100644 --- a/django/db/models/lookups.py +++ b/django/db/models/lookups.py @@ -1,9 +1,7 @@ import itertools import math -import warnings from django.core.exceptions import EmptyResultSet, FullResultSet -from django.db.backends.base.operations import BaseDatabaseOperations from django.db.models.expressions import Case, ColPairs, Expression, Func, Value, When from django.db.models.fields import ( BooleanField, @@ -15,7 +13,6 @@ from django.db.models.fields import ( ) from django.db.models.query_utils import RegisterLookupMixin from django.utils.datastructures import OrderedSet -from django.utils.deprecation import RemovedInDjango60Warning from django.utils.functional import cached_property from django.utils.hashable import make_hashable @@ -224,22 +221,6 @@ class BuiltinLookup(Lookup): def process_lhs(self, compiler, connection, lhs=None): lhs_sql, params = super().process_lhs(compiler, connection, lhs) field_internal_type = self.lhs.output_field.get_internal_type() - if ( - hasattr(connection.ops.__class__, "field_cast_sql") - and connection.ops.__class__.field_cast_sql - is not BaseDatabaseOperations.field_cast_sql - ): - warnings.warn( - ( - "The usage of DatabaseOperations.field_cast_sql() is deprecated. " - "Implement DatabaseOperations.lookup_cast() instead." - ), - RemovedInDjango60Warning, - ) - db_type = self.lhs.output_field.db_type(connection=connection) - lhs_sql = ( - connection.ops.field_cast_sql(db_type, field_internal_type) % lhs_sql - ) lhs_sql = ( connection.ops.lookup_cast(self.lookup_name, field_internal_type) % lhs_sql ) diff --git a/docs/releases/6.0.txt b/docs/releases/6.0.txt index 7d64f24bfa..c451902754 100644 --- a/docs/releases/6.0.txt +++ b/docs/releases/6.0.txt @@ -260,6 +260,8 @@ to remove usage of these features. * The ``DjangoDivFormRenderer`` and ``Jinja2DivFormRenderer`` transitional form renderers are removed. +* ``BaseDatabaseOperations.field_cast_sql()`` is removed. + See :ref:`deprecated-features-5.1` for details on these changes, including how to remove usage of these features. diff --git a/tests/backends/base/test_operations.py b/tests/backends/base/test_operations.py index 3223550446..a0bd50351c 100644 --- a/tests/backends/base/test_operations.py +++ b/tests/backends/base/test_operations.py @@ -1,12 +1,10 @@ import decimal -from unittest import mock from django.core.management.color import no_style from django.db import NotSupportedError, connection, transaction from django.db.backends.base.operations import BaseDatabaseOperations from django.db.models import DurationField from django.db.models.expressions import Col -from django.db.models.lookups import Exact from django.test import ( SimpleTestCase, TestCase, @@ -15,7 +13,6 @@ from django.test import ( skipIfDBFeature, ) from django.utils import timezone -from django.utils.deprecation import RemovedInDjango60Warning from ..models import Author, Book @@ -224,25 +221,3 @@ class SqlFlushTests(TransactionTestCase): self.assertEqual(author.pk, 1) book = Book.objects.create(author=author) self.assertEqual(book.pk, 1) - - -class DeprecationTests(TestCase): - def test_field_cast_sql_warning(self): - base_ops = BaseDatabaseOperations(connection=connection) - msg = ( - "DatabaseOperations.field_cast_sql() is deprecated use " - "DatabaseOperations.lookup_cast() instead." - ) - with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx: - base_ops.field_cast_sql("integer", "IntegerField") - self.assertEqual(ctx.filename, __file__) - - def test_field_cast_sql_usage_warning(self): - compiler = Author.objects.all().query.get_compiler(connection.alias) - msg = ( - "The usage of DatabaseOperations.field_cast_sql() is deprecated. Implement " - "DatabaseOperations.lookup_cast() instead." - ) - with mock.patch.object(connection.ops.__class__, "field_cast_sql"): - with self.assertRaisesMessage(RemovedInDjango60Warning, msg): - Exact("name", "book__author__name").as_sql(compiler, connection)