From 13f79cb58e577a7af1ba3bab1f0a151850cd3838 Mon Sep 17 00:00:00 2001 From: Daniel Hillier Date: Tue, 20 Apr 2021 10:25:46 +1000 Subject: [PATCH] Increase max bulk_batch_size The previous limit was a max of 1000 query parameters. This is changed to a max of 1000 rows (the max number of rows allowed for inserting in a single statement by mssql) or however many rows can be inserted while keeping the number of query parameters below 2050 per insert statement (mssql reports a max allowed of 2100 parameters but a few parameters are reserved for executing the query). --- mssql/operations.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/mssql/operations.py b/mssql/operations.py index 5f8ebb47..3c797659 100644 --- a/mssql/operations.py +++ b/mssql/operations.py @@ -49,12 +49,20 @@ def bulk_batch_size(self, fields, objs): are the fields going to be inserted in the batch, the objs contains all the objects to be inserted. """ - objs_len, fields_len, max_row_values = len(objs), len(fields), 1000 - if (objs_len * fields_len) <= max_row_values: - size = objs_len - else: - size = max_row_values // fields_len - return size + max_insert_rows = 1000 + fields_len = len(fields) + if fields_len == 0: + # Required for empty model + # (bulk_create.tests.BulkCreateTests.test_empty_model) + return max_insert_rows + + # MSSQL allows a query to have 2100 parameters but some parameters are + # taken up defining `NVARCHAR` parameters to store the query text and + # query parameters for the `sp_executesql` call. This should only take + # up 2 parameters but I've had this error when sending 2098 parameters. + max_query_params = 2050 + # inserts are capped at 1000 rows regardless of number of query params. + return min(max_insert_rows, max_query_params // fields_len) def bulk_insert_sql(self, fields, placeholder_rows): placeholder_rows_sql = (", ".join(row) for row in placeholder_rows)