Skip to content

Commit 13f79cb

Browse files
committed
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).
1 parent ff59848 commit 13f79cb

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

mssql/operations.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,20 @@ def bulk_batch_size(self, fields, objs):
4949
are the fields going to be inserted in the batch, the objs contains
5050
all the objects to be inserted.
5151
"""
52-
objs_len, fields_len, max_row_values = len(objs), len(fields), 1000
53-
if (objs_len * fields_len) <= max_row_values:
54-
size = objs_len
55-
else:
56-
size = max_row_values // fields_len
57-
return size
52+
max_insert_rows = 1000
53+
fields_len = len(fields)
54+
if fields_len == 0:
55+
# Required for empty model
56+
# (bulk_create.tests.BulkCreateTests.test_empty_model)
57+
return max_insert_rows
58+
59+
# MSSQL allows a query to have 2100 parameters but some parameters are
60+
# taken up defining `NVARCHAR` parameters to store the query text and
61+
# query parameters for the `sp_executesql` call. This should only take
62+
# up 2 parameters but I've had this error when sending 2098 parameters.
63+
max_query_params = 2050
64+
# inserts are capped at 1000 rows regardless of number of query params.
65+
return min(max_insert_rows, max_query_params // fields_len)
5866

5967
def bulk_insert_sql(self, fields, placeholder_rows):
6068
placeholder_rows_sql = (", ".join(row) for row in placeholder_rows)

0 commit comments

Comments
 (0)