diff options
| author | JaeHyuck Sa <wogur981208@gmail.com> | 2026-01-15 08:06:06 -0500 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2026-01-16 09:15:53 -0500 |
| commit | b98075dc6205374746cf1ad6d3533b9a1d9cf22e (patch) | |
| tree | 2c227604a0fd4e8ac7572942592557b9323e7709 /django | |
| parent | 07a16407452f5b62594661ae7ae589eca8cccd4d (diff) | |
Refs #36822 -- Hoisted bulk_batch_size() implementations to base backend.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/backends/base/operations.py | 14 | ||||
| -rw-r--r-- | django/db/backends/oracle/operations.py | 14 | ||||
| -rw-r--r-- | django/db/backends/sqlite3/operations.py | 20 |
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) |
