Ошибка целостности Django-Postgres: дубликат ключа --- как исправить?

Я получаю сообщение об ошибке целостности при добавлении нового экземпляра модели, вот трассировка:

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"

Я думаю, что автоинкремент ключа не синхронизирован с идентификаторами экземпляра (предположим, основываясь на других сообщениях), но я не уверен, как это исправить. Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: попросил модели, вот модель, из-за которой возникает ошибка. Тем не менее, он работал в течение некоторого времени без каких-либо проблем, поэтому вряд ли это вызвано в модели DEF...

Класс 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

2 ответа

Решение

У меня было это при загрузке резервных копий баз данных раньше. Понятия не имею, почему postgres не обновил последовательность должным образом - возможно, возникла ошибка, которую я не видел, - но решение, которое я использовал, состояло в том, чтобы проверить максимальное значение в поле первичного ключа, а затем выбрать из последовательность, прикрепленная к нему (вручную), чтобы получить эту последовательность в нужном месте.

Вы можете перечислить все последовательности в базе данных из клиента командной строки (psql) с \ds, Там, вероятно, один по имени что-то вроде tempManage_childtemplate_previewPath_id_seq,

Нечто подобное должно работать. Сделайте резервную копию вашей базы данных, прежде чем вносить изменения вручную!

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>;

Только что понял, вы, вероятно, также хотите увидеть, что уже в последовательности, поэтому я также добавил выбор выше. Проверьте last_value запись.

Имеют значение только две строки:

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

Вы добавили уникальный ключ в previewPath и пытаетесь вставить значение, которое уже существует. Итак, вам нужно выяснить, почему приложение пытается вставить повторяющиеся preivewPaths. (Я понятия не имею, где вы получаете идентификатор синхронизации).

Другие вопросы по тегам