获取django.db.utils.IntegrityError:重复的键值违反了唯一约束,但该值不存在

获取django.db.utils.IntegrityError:重复的键值违反了唯一约束,但该值不存在,django,postgresql,django-models,django-orm,unique-constraint,Django,Postgresql,Django Models,Django Orm,Unique Constraint,我在Django中使用PostgreSQL,并且我试图使用Django ORM从DB中获取一些对象 Medicine.objects.get(unique_item_id=26775) Medicine.objects.create(unique_item_id=26775) 但是在获取时,我遇到了错误->item\u medicine.models.DoesNotExist:药物匹配查询不存在。 然后我尝试使用Django ORM插入相同的代码 Medicine.objects.get(u

我在Django中使用PostgreSQL,并且我试图使用Django ORM从DB中获取一些对象

Medicine.objects.get(unique_item_id=26775)
Medicine.objects.create(unique_item_id=26775)
但是在获取时,我遇到了错误->
item\u medicine.models.DoesNotExist:药物匹配查询不存在。

然后我尝试使用Django ORM插入相同的代码

Medicine.objects.get(unique_item_id=26775)
Medicine.objects.create(unique_item_id=26775)
但我再次得到错误
psycopg2.errors.UniqueViolation:重复键值违反唯一约束“item\u medicine\u unique\u item\u id\u key”详细信息:key(unique\u item\u id)=(26775)已存在。

在我的模型中,我为
unique\u item\u id
字段添加了
unique=True

我不知道为什么会这样。我试着在类似的帖子上给出答案,但没有任何效果

回溯:

Traceback (most recent call last):
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "item_medicine_medicine_unique_item_id_key"
DETAIL:  Key (unique_item_id)=(26775) already exists.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-46fdec6a582b>", line 1, in <module>
    Medicine.objects.create(unique_item_id=26775)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/query.py", line 394, in create
    obj.save(force_insert=True, using=self.db)
  File "/home/rohit/Projects/medicine/item_medicine/models.py", line 58, in save
    super(Medicine, self).save(*args, **kwargs)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/base.py", line 808, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/base.py", line 838, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/base.py", line 924, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/base.py", line 963, in _do_insert
    using=using, raw=raw)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/query.py", line 1076, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1112, in execute_sql
    cursor.execute(sql, params)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: duplicate key value violates unique constraint "item_medicine_medicine_unique_item_id_key"
DETAIL:  Key (unique_item_id)=(26775) already exists.
回溯(最近一次呼叫最后一次):
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/backends/utils.py”,执行中的第64行
返回self.cursor.execute(sql,params)
psycopg2.errors.UniqueViolation:重复的键值违反唯一约束“item\u medicine\u unique\u item\u id\u key”
详细信息:键(唯一项id)=(26775)已存在。
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/IPython/core/interactiveshell.py”,第2963行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第1行,在
Medicine.objects.create(唯一项目id=26775)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/manager.py”,第85行,在manager\u方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/query.py”,第394行,在create中
对象保存(force_insert=True,using=self.db)
文件“/home/rohit/Projects/medicine/item_medicine/models.py”,第58行,保存
超级(药物,自我)。保存(*args,**kwargs)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/base.py”,第808行,保存
强制更新=强制更新,更新字段=更新字段)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/base.py”,第838行,在save_base中
更新=自我。保存表格(原始、cls、强制插入、强制更新、使用、更新字段)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/base.py”,第924行,在保存表中
结果=self.\u do\u insert(cls.\u base\u manager,using,fields,update\u pk,raw)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/base.py”,第963行,插入
使用=使用,原始=原始)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/manager.py”,第85行,在manager\u方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/query.py”,第1076行,插入
return query.get\u编译器(using=using).execute\u sql(return\u id)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/models/sql/compiler.py”,第1112行,在execute\u sql中
cursor.execute(sql,params)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/backends/utils.py”,执行中第79行
返回super(CursorDebugWrapper,self).execute(sql,params)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/backends/utils.py”,执行中的第64行
返回self.cursor.execute(sql,params)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/utils.py”,第94行,在__
6.重新播放(dj_exc_类型、dj_exc_值、回溯)
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/utils/six.py”,第685行,在reraise中
通过_回溯(tb)提升值
文件“/home/rohit/virtualenvs/envmedicine/lib/python3.6/site packages/django/db/backends/utils.py”,执行中的第64行
返回self.cursor.execute(sql,params)
django.db.utils.IntegrityError:重复的键值违反了唯一约束“item\u medicine\u medicine\u unique\u item\u id\u key”
详细信息:键(唯一项id)=(26775)已存在。

提前谢谢大家

如果您在
Medicine.objects
管理器中进行任何类型的过滤,那么您很可能会遇到这个问题。例如,假设已定义以下模型和管理器

类SoftDeleteManager(models.Manager):
def get_queryset(自我):
return super().get_queryset().filter(deleted_at=None)
医疗类(型号.型号):
...
unique\u item\u id=models.IntegerField(unique=True)
已删除\u at=models.DateTimeField(null=True)
对象=SoftDeleteManager()
冲突=Medecine.objects.create(唯一项目id=26775,在某个日期时间删除)
Medecine.objects.get(unique_item_id=26775)#结果为DoesNotExist
Medecine.objects.create(unique_item_id=26775)#导致IntegrityError
如果不是这样,那么您可能有一个已损坏的PostgreSQL索引

我建议你试着在桌子上跑步


REINDEX TABLE item\u medicine\u medicine

我不确定问题的原因,但您是否尝试过
medicine.objects.filter(unique\u item\u id=26775).first()
?我尝试过filter,但它返回空查询集try this medicine.objects.get(unique\u item\u id\u id=26775)不存在获取错误字段这有点奇怪,是否只有PostgreSQL才会发生这种情况?如果是这样的话,新项目是否可以复制@RohitchoprainDect和我建议在console或PgAdmin中使用psql直接检查数据库中发生了什么。从唯一项目id=26775的药品中选择*。