Hi Jeroen,

On 11/18/2014 08:44 AM, Jeroen Pulles wrote:
> the model.save() arguments `force_update` and `update_fields` cause an
> explicit check if the update statement matched any rows.
> 
> Every once in a while one of my applications runs into a "race
> condition" where one process does an update (with one of the model save
> arguments) and another process just removed the same object. You then
> get a very generic DatabaseError with the message "Forced update did not
> affect any rows.", or "Save with update_fields did not affect any
> rows.". This invariably makes me scratch my head and wonder what happened.
> 
> As per ticket #21761, I don't understand why that is an error and a
> regular call to save() doesn't throw an error.

A regular call to save() will do an INSERT if no rows are updated by an
UPDATE, so neither case is an error. But if you explicitly say "I want
an update" and there is nothing to update, in many cases that is a bug
in your code, so we raise an error.

> But since I can easily recover from this exception, I think it would be
> nice if these exceptions would be typed in a more specific subclass so
> that I can catch them and do something nice for the end-user.

I think it would be reasonable to raise a sub-type of DatabaseError for
these "nothing was updated" errors, so they can be more easily caught
and handled without parsing exception messages. Could you file a ticket
(and pull request?) for that?

> As a side note, you might want to check that a single row is updated,
> and not "more than zero"; just in case a primary key is composed from
> more than one column and there's some other error...

Django models don't support compound primary keys at this point (though
there is hope that they may in the future). If you can show a situation
that is achievable through public APIs where the check for "more than
zero" gives wrong results, that would be worth filing a separate bug for.

Carl

-- 
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-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/546B6CF4.1030900%40oddbird.net.
For more options, visit https://groups.google.com/d/optout.

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to