Ошибка целостности Django-Postgres: дубликат ключа --- как исправить? - PullRequest
2 голосов
/ 29 марта 2011

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

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 ]

8 голосов
/ 29 марта 2011

У меня было такое при загрузке резервных копий баз данных раньше.Понятия не имею, почему 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.

2 голосов
/ 29 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...