Changes between Initial Version and Version 1 of Ticket #33579


Ignore:
Timestamp:
Mar 15, 2022, 5:06:39 PM (3 years ago)
Author:
Simon Charette
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • Ticket #33579 – Description

    initial v1  
    11When `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` [https://github.com/django/django/blob/3b3f38b3b09b0f2373e51406ecb8c9c45d36aebc/django/db/models/base.py#L1000 is raised].
    22
    3 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.
     3Since the resulting exception cannot be differentiated by its `type` from any other dababase errors occuring 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.
    44
    5 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.
     5In 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 introduce a new `DatabaseError` subclass that would be raised instead when an unexpected empty update occurs.
    66
    77I believe [https://github.com/django/django/blob/3b3f38b3b09b0f2373e51406ecb8c9c45d36aebc/django/db/models/base.py#L997-L1000 both instances] should be switched to this pattern (`force_update` and `update_fields`).
Back to Top