﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
12144	Django throwing ProgrammingError instead of IntegrityError for Duplicate Key with Postgres	tghw	nobody	"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.
"		closed	Uncategorized	1.1		wontfix			Unreviewed	0	0	0	0	0	0
