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"
我认为密钥的自动增量与实例 ID 不同步(根据其他帖子猜测),但我不确定如何修复它。任何帮助将不胜感激!
编辑:询问模型,这是错误根源的模型。然而它已经运行了一段时间没有任何问题,所以它不太可能是在模型定义中引起的...
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
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我之前在加载数据库备份时就遇到过这种情况。不知道为什么 postgres 没有正确更新序列 - 可能遇到了我没有看到的错误 - 但我使用的解决方案是检查主键字段中的最大值,然后从(手动)附加到它的序列,以将该序列放在正确的位置。
您可以使用
\ds
从命令行客户端 (psql
) 列出数据库中的所有序列。可能有一个名为tempManage_childtemplate_previewPath_id_seq
的名称。像这样的东西应该有效。在手动更改数据库之前先备份它!
刚刚意识到,您可能还想查看序列中已有的内容,因此我也在上面添加了一个选择。查看
last_value
条目。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 liketempManage_childtemplate_previewPath_id_seq
.Something like this should work. Back up your database before manually altering it!
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.唯一重要的两行是:
您已向 PreviewPath 添加了唯一的键,并且正在尝试插入已存在的值。因此,您需要弄清楚应用程序为何尝试插入重复的 preivewPaths。 (我不知道你在哪里获得 ID 同步。)
The only two lines that matter are:
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.)