Django-Postgres Integrity Error: Duplicate key — how to fix?

不羁的心 提交于 2020-01-04 10:59:12

问题


Im getting an Integrity Error when adding a new instance of a model, here's the traceback:

Traceback:
File "/home/robain/webapps/django/lib/python2.6/django/core/handlers/base.py" in get_response
  100.                     response = callback(request, *callback_args, **callback_kwargs)
File "/home/robain/webapps/django/lib/python2.6/django/contrib/admin/views/decorators.py" in _checklogin
  33.             return view_func(request, *args, **kwargs)
File "/home/robain/webapps/django/tmanage/tempManage/src/CTmanage.py" in addCT
  101.             CT.save()
File "/home/robain/webapps/django/lib/python2.6/django/db/models/base.py" in save
  434.         self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/home/robain/webapps/django/lib/python2.6/django/db/models/base.py" in save_base
  527.                     result = manager._insert(values, return_id=update_pk, using=using)
File "/home/robain/webapps/django/lib/python2.6/django/db/models/manager.py" in _insert
  195.         return insert_query(self.model, values, **kwargs)
File "/home/robain/webapps/django/lib/python2.6/django/db/models/query.py" in insert_query
  1479.     return query.get_compiler(using=using).execute_sql(return_id)
File "/home/robain/webapps/django/lib/python2.6/django/db/models/sql/compiler.py" in execute_sql
  783.         cursor = super(SQLInsertCompiler, self).execute_sql(None)
File "/home/robain/webapps/django/lib/python2.6/django/db/models/sql/compiler.py" in execute_sql
  727.         cursor.execute(sql, params)
File "/home/robain/webapps/django/lib/python2.6/django/db/backends/util.py" in execute
  15.             return self.cursor.execute(sql, params)
File "/home/robain/webapps/django/lib/python2.6/django/db/backends/postgresql_psycopg2/base.py" in execute
  44.             return self.cursor.execute(query, args)

Exception Type: IntegrityError at /tempManage/addCT/13/34/
Exception Value: duplicate key value violates unique constraint "tempManage_childtemplate_previewPath_key"

I think the autoincrement of the key is out of sync with the instance id's (guess based on other posts), but I'm not sure how to fix it. Any help would be much appreciated!

EDIT: asked for models, here is the model where the error stems from. However it has been running for some time without any problem, so it's unlikely it's caused in the model def...

class ChildTemplate(models.Model):

def get_CTswf_path(self, filename):
    return os.path.join('swf', 'Company_' + str(self.father.company.id), "FT_" + str(self.father.id), 'CT_' + str(self.id), filename)

father = models.ForeignKey('FatherTemplate', unique=False, verbose_name='Father', blank=True, null=True)
childName = models.CharField(max_length=20, blank=False, verbose_name='Child Name')
location = models.ForeignKey(Location, unique=False, blank=True, null=True)
company = models.ForeignKey(Company, unique=False, blank=True, null=True)
isCorporate = models.BooleanField(blank=False, verbose_name='Corporate')
templatePath = models.FileField(upload_to=get_CTswf_path, verbose_name='Path', blank=True, null=True)
previewPath = models.CharField(max_length=200, blank=True, unique=True)
#migrateTest = models.BooleanField()

def __unicode__(self):
    return self.childName

回答1:


I've had this happen when loading backups of databases before. Have no idea why postgres didn't get the sequence properly up to date - probably ran into an error I didn't see - but the solution I've used was to check the maximum value in the primary key field, and then select from the sequence attached to it (manually) to get that sequence in the right place.

You can list all sequences in the database from the command line client (psql) with \ds. There's probably one named something like tempManage_childtemplate_previewPath_id_seq.

Something like this should work. Back up your database before manually altering it!

SELECT max(id) FROM <model_table>;
SELECT * FROM tempManage_childtemplate_previewPath_id_seq;

ALTER SEQUENCE tempManage_childtemplate_previewPath_id_seq RESTART WITH <result of above>;

Just realized, you probably also want to see what's already in the sequence, so I've added a select above too. Check out the last_value entry.




回答2:


The only two lines that matter are:

Exception Value: duplicate key value violates unique constraint "tempManage_childtemplate_previewPath_key"
previewPath = models.CharField(max_length=200, blank=True, unique=True)

You have added a unique key to previewPath and are trying to insert a value that already exists. So, you need to figure out why the app is trying to insert duplicate preivewPaths. (I have no idea where you are getting id out sync.)



来源:https://stackoverflow.com/questions/5476444/django-postgres-integrity-error-duplicate-key-how-to-fix

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!