From 5a2c1bc07d126ce32efaa157e712a8f3a7457b74 Mon Sep 17 00:00:00 2001 From: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> Date: Mon, 27 Jan 2025 10:28:21 +0100 Subject: Fixed #36118 -- Accounted for multiple primary keys in bulk_update max_batch_size. Co-authored-by: Simon Charette --- tests/backends/oracle/test_operations.py | 17 ++++++++++++++--- tests/backends/sqlite/test_operations.py | 24 +++++++++++++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/backends/oracle/test_operations.py b/tests/backends/oracle/test_operations.py index 523bdcda8a..1f9447bde7 100644 --- a/tests/backends/oracle/test_operations.py +++ b/tests/backends/oracle/test_operations.py @@ -1,7 +1,7 @@ import unittest from django.core.management.color import no_style -from django.db import connection +from django.db import connection, models from django.test import TransactionTestCase from ..models import Person, Tag @@ -22,14 +22,25 @@ class OperationsTests(TransactionTestCase): objects = range(2**16) self.assertEqual(connection.ops.bulk_batch_size([], objects), len(objects)) # Each field is a parameter for each object. + first_name_field = Person._meta.get_field("first_name") + last_name_field = Person._meta.get_field("last_name") self.assertEqual( - connection.ops.bulk_batch_size(["id"], objects), + connection.ops.bulk_batch_size([first_name_field], objects), connection.features.max_query_params, ) self.assertEqual( - connection.ops.bulk_batch_size(["id", "other"], objects), + connection.ops.bulk_batch_size( + [first_name_field, last_name_field], + objects, + ), connection.features.max_query_params // 2, ) + composite_pk = models.CompositePrimaryKey("first_name", "last_name") + composite_pk.fields = [first_name_field, last_name_field] + self.assertEqual( + connection.ops.bulk_batch_size([composite_pk, first_name_field], objects), + connection.features.max_query_params // 3, + ) def test_sql_flush(self): statements = connection.ops.sql_flush( diff --git a/tests/backends/sqlite/test_operations.py b/tests/backends/sqlite/test_operations.py index 3ff055248d..10cbffdf80 100644 --- a/tests/backends/sqlite/test_operations.py +++ b/tests/backends/sqlite/test_operations.py @@ -1,7 +1,7 @@ import unittest from django.core.management.color import no_style -from django.db import connection +from django.db import connection, models from django.test import TestCase from ..models import Person, Tag @@ -86,3 +86,25 @@ class SQLiteOperationsTests(TestCase): "zzz'", statements[-1], ) + + def test_bulk_batch_size(self): + self.assertEqual(connection.ops.bulk_batch_size([], [Person()]), 1) + first_name_field = Person._meta.get_field("first_name") + last_name_field = Person._meta.get_field("last_name") + self.assertEqual( + connection.ops.bulk_batch_size([first_name_field], [Person()]), 500 + ) + self.assertEqual( + connection.ops.bulk_batch_size( + [first_name_field, last_name_field], [Person()] + ), + connection.features.max_query_params // 2, + ) + composite_pk = models.CompositePrimaryKey("first_name", "last_name") + composite_pk.fields = [first_name_field, last_name_field] + self.assertEqual( + connection.ops.bulk_batch_size( + [composite_pk, first_name_field], [Person()] + ), + connection.features.max_query_params // 3, + ) -- cgit v1.3