Opened 4 years ago

Last modified 15 months ago

#32433 closed Bug

Delete distinct produces an unexpected and potentially harmful SQL — at Version 1

Reported by: egism Owned by: nobody
Component: Database layer (models, ORM) Version: 3.1
Severity: Normal Keywords: orm, delete, distinct
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by egism)

I was looking for a way to delete the first Comment of each Post (a sample domain). Since I know that every new Post starts with a system generated comment I decided to go with:

Comment.objects.order_by('post_id', 'created_at').distinct('post_id').delete()

Before proceeding I tested it with:

Comment.objects.order_by('post_id', 'created_at').distinct('post_id').count()

Made sure the result actually contains what I needed and proceeded with the delete(). The result was rather surprising. I was notified that the whole table was wiped clean. I then checked the actual SQL that was executed and it was a simple DELETE FROM comments;.

As an ORM user, I would say it is the worst outcome possible and I would at least expect an error in such a case or ideally a SQL of what I was trying to achieve. At the same time, count and delete produces an inconsistent result which is even more mistaking.

Potential solutions:

  • raise an error with a decent explanation
  • produce a desired SQL according to the query

Since I have never submitted a change to Django, I have a very limited knowledge of the ORM and its intricacies. I could give it a try and issue a patch for this with some guidance.

Change History (1)

comment:1 by egism, 4 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top