From 38660a612cd924199df83b93807604cadf6d5125 Mon Sep 17 00:00:00 2001 From: Sage Abdullah Date: Thu, 8 May 2025 09:10:00 +0200 Subject: [PATCH] Refs #36143 -- Tested bulk_batch_size limit for bulk_update and bulk_create. --- tests/bulk_create/tests.py | 8 ++++++++ tests/queries/test_bulk_update.py | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/tests/bulk_create/tests.py b/tests/bulk_create/tests.py index e1b7e42d14..d590a292de 100644 --- a/tests/bulk_create/tests.py +++ b/tests/bulk_create/tests.py @@ -293,6 +293,14 @@ class BulkCreateTests(TestCase): with self.assertNumQueries(ceil(len(objs) / max_batch_size)): Country.objects.bulk_create(objs, batch_size=max_batch_size + 1) + @skipUnlessDBFeature("has_bulk_insert") + def test_max_batch_size(self): + objs = [Country(name=f"Country {i}") for i in range(1000)] + fields = ["name", "iso_two_letter", "description"] + max_batch_size = connection.ops.bulk_batch_size(fields, objs) + with self.assertNumQueries(ceil(len(objs) / max_batch_size)): + Country.objects.bulk_create(objs) + @skipUnlessDBFeature("has_bulk_insert") def test_bulk_insert_expressions(self): Restaurant.objects.bulk_create( diff --git a/tests/queries/test_bulk_update.py b/tests/queries/test_bulk_update.py index 9fa9c3b9b8..765fa934ca 100644 --- a/tests/queries/test_bulk_update.py +++ b/tests/queries/test_bulk_update.py @@ -1,6 +1,8 @@ import datetime +from math import ceil from django.core.exceptions import FieldDoesNotExist +from django.db import connection from django.db.models import F from django.db.models.functions import Lower from django.db.utils import IntegrityError @@ -69,6 +71,15 @@ class BulkUpdateNoteTests(TestCase): with self.assertNumQueries(len(self.notes)): Note.objects.bulk_update(self.notes, fields=["note"], batch_size=1) + def test_max_batch_size(self): + max_batch_size = connection.ops.bulk_batch_size( + # PK is used twice, see comment in bulk_update(). + [Note._meta.pk, Note._meta.pk, Note._meta.get_field("note")], + self.notes, + ) + with self.assertNumQueries(ceil(len(self.notes) / max_batch_size)): + Note.objects.bulk_update(self.notes, fields=["note"]) + def test_unsaved_models(self): objs = self.notes + [Note(note="test", misc="test")] msg = "All bulk_update() objects must have a primary key set."