Feature Request: Allow passing no-op filters to QuerySet's bulk_update() when updating tables with partitions

114 views
Skip to first unread message

opqpop

unread,
Jul 12, 2021, 8:11:20 PM7/12/21
to Django developers (Contributions to Django itself)
Hi, I'd like to pass additional partition columns into the filters for a QuerySet's bulk_update(). These would be no-op filters solely for the DB to understand from the query to lock rows in a single partition vs all partitions. 

Ex: I'd add "orig_city_id = 52" into this pk filter that bulk_update uses, because my table is partitioned on orig_city_id and passing the partition filter helps scale up when updating a lot of records: https://github.com/django/django/blob/d8c90d4c22cb218f1c170eba086c53d3dff7fbc0/django/db/models/query.py#L569

What are folks thoughts on this feature request? 

Currently I copy pasted bulk_update and tweaked it with a simple change to work (https://snippi.com/s/55qlpbn). Was wondering if this makes sense to add to Django for everyone.

Motivation for this change:
http://www.databasesoup.com/2012/06/postgresqlconf-maxlockspertransaction.html, describing how UPDATES on tables with lots of partitions without the partition column in the WHERE clauses causes DB to lock too many rows and eventually get OOM issues 

Adam Johnson

unread,
Jul 22, 2021, 1:30:30 PM7/22/21
to django-d...@googlegroups.com
It should already work to do `Model.objects.filter(...).bulk_update(...)` , no?

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/0162b31d-2734-4e11-8909-e58e219a78e1n%40googlegroups.com.

opqpop

unread,
Jul 25, 2021, 9:09:34 PM7/25/21
to Django developers (Contributions to Django itself)
Wow thanks so much Adam. I just verified that doing the filter before bulk_update indeed works. 

I didn't realize I could just filter it before doing the bulk_update and it would carry over with the pk filter that gets added in bulk_update. I will have to brush up on understanding Querysets better.

Thanks again!

Reply all
Reply to author
Forward
0 new messages