summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJaeHyuck Sa <wogur981208@gmail.com>2026-01-15 08:06:06 -0500
committerJacob Walls <jacobtylerwalls@gmail.com>2026-01-16 09:15:53 -0500
commitb98075dc6205374746cf1ad6d3533b9a1d9cf22e (patch)
tree2c227604a0fd4e8ac7572942592557b9323e7709 /django
parent07a16407452f5b62594661ae7ae589eca8cccd4d (diff)
Refs #36822 -- Hoisted bulk_batch_size() implementations to base backend.
Diffstat (limited to 'django')
-rw-r--r--django/db/backends/base/operations.py14
-rw-r--r--django/db/backends/oracle/operations.py14
-rw-r--r--django/db/backends/sqlite3/operations.py20
3 files changed, 13 insertions, 35 deletions
diff --git a/django/db/backends/base/operations.py b/django/db/backends/base/operations.py
index e345701438..fac6215899 100644
--- a/django/db/backends/base/operations.py
+++ b/django/db/backends/base/operations.py
@@ -2,12 +2,14 @@ import datetime
import decimal
import json
from importlib import import_module
+from itertools import chain
import sqlparse
from django.conf import settings
from django.db import NotSupportedError, transaction
from django.db.models.expressions import Col
+from django.db.models.fields.composite import CompositePrimaryKey
from django.utils import timezone
from django.utils.duration import duration_microseconds
from django.utils.encoding import force_str
@@ -78,7 +80,17 @@ class BaseDatabaseOperations:
are the fields going to be inserted in the batch, the objs contains
all the objects to be inserted.
"""
- return len(objs)
+ if self.connection.features.max_query_params is None or not fields:
+ return len(objs)
+
+ return self.connection.features.max_query_params // len(
+ list(
+ chain.from_iterable(
+ field.fields if isinstance(field, CompositePrimaryKey) else [field]
+ for field in fields
+ )
+ )
+ )
def format_for_duration_arithmetic(self, sql):
raise NotImplementedError(
diff --git a/django/db/backends/oracle/operations.py b/django/db/backends/oracle/operations.py
index 75f80941b3..802f27a3c6 100644
--- a/django/db/backends/oracle/operations.py
+++ b/django/db/backends/oracle/operations.py
@@ -1,7 +1,6 @@
import datetime
import uuid
from functools import lru_cache
-from itertools import chain
from django.conf import settings
from django.db import NotSupportedError
@@ -9,7 +8,6 @@ from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.utils import split_tzname_delta, strip_quotes, truncate_name
from django.db.models import (
AutoField,
- CompositePrimaryKey,
Exists,
ExpressionWrapper,
Lookup,
@@ -707,18 +705,6 @@ END;
)
return super().subtract_temporals(internal_type, lhs, rhs)
- def bulk_batch_size(self, fields, objs):
- """Oracle restricts the number of parameters in a query."""
- fields = list(
- chain.from_iterable(
- field.fields if isinstance(field, CompositePrimaryKey) else [field]
- for field in fields
- )
- )
- if fields:
- return self.connection.features.max_query_params // len(fields)
- return len(objs)
-
def conditional_expression_supported_in_where_clause(self, expression):
"""
Oracle supports only EXISTS(...) or filters in the WHERE clause, others
diff --git a/django/db/backends/sqlite3/operations.py b/django/db/backends/sqlite3/operations.py
index ac98324b2e..23c17054d2 100644
--- a/django/db/backends/sqlite3/operations.py
+++ b/django/db/backends/sqlite3/operations.py
@@ -29,26 +29,6 @@ class DatabaseOperations(BaseDatabaseOperations):
# SQLite. Use JSON_TYPE() instead.
jsonfield_datatype_values = frozenset(["null", "false", "true"])
- def bulk_batch_size(self, fields, objs):
- """
- SQLite has a variable limit defined by SQLITE_LIMIT_VARIABLE_NUMBER
- (reflected in max_query_params).
- """
- fields = list(
- chain.from_iterable(
- (
- field.fields
- if isinstance(field, models.CompositePrimaryKey)
- else [field]
- )
- for field in fields
- )
- )
- if fields:
- return self.connection.features.max_query_params // len(fields)
- else:
- return len(objs)
-
def check_expression_support(self, expression):
bad_fields = (models.DateField, models.DateTimeField, models.TimeField)
bad_aggregates = (models.Sum, models.Avg, models.Variance, models.StdDev)