#32433: Delete distinct produces an unexpected and potentially harmful SQL
-------------------------------------+-------------------------------------
     Reporter:  egism                |                    Owner:  nobody
         Type:  Uncategorized        |                   Status:  new
    Component:  Database layer       |                  Version:  3.1
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:  orm, delete,         |             Triage Stage:
  distinct, postgresql               |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by egism:

Old 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

New 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

 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.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32433#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/063.be279b0c0a729f3207d285623c31abc1%40djangoproject.com.

Reply via email to