Opened 3 years ago
Last modified 3 months ago
#33579 assigned New feature
Raise a specialized exception when Model.save(update_fields) does not affect any rows — at Initial Version
Reported by: | Simon Charette | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 4.0 |
Severity: | Normal | Keywords: | |
Cc: | Sardorbek Imomaliev | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | yes |
Needs tests: | yes | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description
When Model.save(update_fields)
is used to update an instance of a previously fetched model and the resulting UPDATE
doesn't affect any row a DatabaseError
is raised.
Since the resulting exception cannot be differentiated by its type
from any other exception raised during save
(e.g. a failed UPDATE
also results in a DatabaseError
) the only pattern to gracefully handle this rare edge case to catch all DatabaseError
and compare its .args[0]
(or str
representation) to a string that doesn't offer any stability guarantees.
In order to make it easier for advanced users that rely on the update_fields
feature to handle this case differently from others where a DatabaseError
is raised I propose that that we introduced a new DatabaseError
subclass that would be raised instead when an unexpected empty update occurs.
I believe both instances should be switched to this pattern (force_update
and update_fields
).