#12144: Django throwing ProgrammingError instead of IntegrityError for Duplicate
Key with Postgres
---------------------------+------------------------------------------------
 Reporter:  tghw           |       Owner:  nobody    
   Status:  new            |   Milestone:            
Component:  Uncategorized  |     Version:  1.1       
 Keywords:                 |       Stage:  Unreviewed
Has_patch:  0              |  
---------------------------+------------------------------------------------
 Using Django 1.1 with pyscopg2. I am using the email-confirmation app
 ([http://github.com/jtauber/django-email-confirmation/]) to make sure
 changes to email addresses are to the right account. In that app is the
 following code:

 {{{
 class EmailAddressManager(models.Manager):
 ...
     def add_email(self, user, email):
         try:
             email_address = self.create(user=user, email=email)
             EmailConfirmation.objects.send_confirmation(email_address)
             return email_address
         except IntegrityError:
             return None
 ...

 class EmailAddress(models.Model):
 ...
     class Meta:
     ...
         unique_together = (
             ("user", "email"),
         )
 }}}

 When add_email() is called with a user/email combination that already
 exists in the database, a ProgrammingError is thrown for the duplicate key
 instead of raising an IntegrityError, as should be the case:

 {{{
 File "c:\python26\lib\site-
 packages\django_email_confirmation-0.1.3-py2.6.egg\emailconfirmation\models.py"
 in add_email
   23.             email_address = self.create(user=user, email=email)
 File "c:\python26\lib\site-packages\django\db\models\manager.py" in create
   126.         return self.get_query_set().create(**kwargs)
 File "c:\python26\lib\site-packages\django\db\models\query.py" in create
   315.         obj.save(force_insert=True)
 File "c:\python26\lib\site-packages\django\db\models\base.py" in save
   410.         self.save_base(force_insert=force_insert,
 force_update=force_update)
 File "c:\python26\lib\site-packages\django\db\models\base.py" in save_base
   495.                     result = manager._insert(values,
 return_id=update_pk)
 File "c:\python26\lib\site-packages\django\db\models\manager.py" in
 _insert
   177.         return insert_query(self.model, values, **kwargs)
 File "c:\python26\lib\site-packages\django\db\models\query.py" in
 insert_query
   1087.     return query.execute_sql(return_id)
 File "c:\python26\lib\site-packages\django\db\models\sql\subqueries.py" in
 execute_sql
   320.         cursor = super(InsertQuery, self).execute_sql(None)
 File "c:\python26\lib\site-packages\django\db\models\sql\query.py" in
 execute_sql
   2369.         cursor.execute(sql, params)
 File "c:\python26\lib\site-packages\django\db\backends\util.py" in execute
   19.             return self.cursor.execute(sql, params)

 Exception Type: ProgrammingError at /profile/
 Exception Value: duplicate key value violates unique constraint
 "emailconfirmation_emailaddress_user_id_key"
 }}}

 It looks to me like that app is doing the right thing, but Django is
 throwing the wrong error.

-- 
Ticket URL: <http://code.djangoproject.com/ticket/12144>
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-updates@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