Opened 4 years ago

Last modified 15 months ago

#32433 closed Bug

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

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

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

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top