#2259: PK Change creates new object instead of update
---------------------------------------------------+------------------------
          Reporter:  e...@edplese.com                |         Owner:  nobody
            Status:  reopened                      |     Milestone:        
         Component:  Database layer (models, ORM)  |       Version:        
        Resolution:                                |      Keywords:        
             Stage:  Design decision needed        |     Has_patch:  0     
        Needs_docs:  1                             |   Needs_tests:  0     
Needs_better_patch:  1                             |  
---------------------------------------------------+------------------------
Comment (by kevin.hower...@gmail.com):

 I think this issue is actually illustrating a greater flaw in the overall
 transactional structure the Django ORM implements.

 Right now a save transaction works like this:

 obj.save

 transaction>
 SELECT obj

 if exists: UPDATE
 else: INSERT
 <transaction

 There are several issues with this.  In a write heave database this will
 likely lead to serious performance issues.  If an object gets deleted,
 there is the chance in a race-condition that it will be re-inserted... and
 obviously you can't change the primary key, because the whole transaction
 works based off of whether an object exists with the same PK.

 How it should work:

 obj = MyModel.objects.get(id = 1)  # there is a private variable set with
 the original PK
 obj.field = 1
 obj.save()                                              # because there is
 the original PK set, it does an update

 So how it works here is based off of private variables.  Going beyond
 having a PK that is private, you could also have the rest of the fields
 have non-mutable private variables to generate cleaner, shorter SQL
 statements ... though I'm not sure that would have any real benefit.

 There should only be inserts on new objects...

 obj = MyModel()

 ... and there is absolutely no reason to do a SELECT at the start of the
 transactional block.  In write heavy applications, this will be horrible
 for performance.

-- 
Ticket URL: <http://code.djangoproject.com/ticket/2259#comment:15>
Django <http://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 post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to