当前位置: 首页 > 知识库问答 >
问题:

Django/Postgres:返回错误:重复的键值违反了唯一约束

公良子轩
2023-03-14

在我从事的一个项目中,这个问题发生过几次,尽管我使用了我在这个网站上找到的“python manage . py sqlsequencereset”修复程序,它工作了一段时间,然后又开始抛出错误。

我一直得到的错误非常简单:

IntegrityError at /projects/v/portola/planting-sites/new/
duplicate key value violates unique constraint "urbanforest_plantingsite_pkey"
DETAIL:  Key (id)=(194016) already exists.

在我看来,我有:

form = PlantingSiteForm(request.POST)
if form.is_valid():
    f = form.save(commit=False)
    if PlantingSite.objects.all().exists():
        last_planting_site = PlantingSite.objects.all().order_by('-created_at')[0]
        f.id_planting_site = last_planting_site.id_planting_site
        f.id_planting_site += 1
    else:
        f.id_planting_site = 100000
    if request.POST.get('neighborhood_id'):
        f.neighborhood = Neighborhood.objects.filter(id_neighborhood=request.POST.get('neighborhood_id'))[0]
    if request.POST.get('district_id'):
        f.district = District.objects.filter(id_district=request.POST.get('district_id'))[0]
    if request.POST.get('basin_type_id'):
        f.basin_type = BasinType.objects.filter(id_basin_type=request.POST.get('basin_type_id'))[0]
    if request.POST.get('aspect_id'):
        f.aspect = Aspect.objects.filter(id_aspect=request.POST.get('aspect_id'))[0]
    if request.POST.get('orientation_id'):
        f.orientation = Orientation.objects.filter(id_orientation=request.POST.get('orientation_id'))[0]
    if request.POST.get('hardscape_damage_id'):
        f.hardscape_damage = HardscapeDamage.objects.filter(id_hardscape_damage=request.POST.get('hardscape_damage_id'))[0]
    if request.POST.get('status_id'):
        f.status = PlantingSiteStatus.objects.filter(id_planting_site_status=request.POST.get('status_id'))[0]
    else:
        f.status = PlantingSiteStatus.objects.filter(id_planting_site_status=9)[0]
    if f.zipcode:
        f.property_zipcode = f.zipcode
    f.created_by_fuf = True
    f.created_by = request.user 
    f.save()

我现在已经做了几次sqlequence重置,然后错误在几周后返回。我没有导入任何数据,但我的同事正在现场使用他们的手机创建新对象,一次一个。

运行sqlsequencereset会得到以下代码:

SELECT setval(pg_get_serial_sequence('"urbanforest_plantingsite"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "urbanforest_plantingsite";

我应该运行更具体的东西吗?我不太熟悉Postgres,因为我只是使用Django命令来处理所有数据库调用。

编辑:需要补充的一点是,我发现运行sqlsequencereset会生成调整sql调用的代码,但实际上并没有运行它。所以我运行了:<br>python管理。py-sqlsequencereset-urbanforest|python-manage。py dbshell注入代码并重建表。

不幸的是,几分钟后我收到了同样的错误。

共有1个答案

向子安
2023-03-14

所以我通过将站点创建转移到while循环中来解决这个问题(至少目前如此)。我认为问题在于Django如何使用模型表单创建对象。因为您创建了对象并用form.save(commit=False)将它保存到内存中,所以您可能会遇到问题,因为它在将对象提交到数据库之前将那些其他字段添加到对象中。

所以现在,至少,这已经解决了这个问题:

while True:
        try:    
            form = PlantingSiteForm(request.POST)
                if form.is_valid():
                    f = form.save(commit=False)
                    if PlantingSite.objects.all().exists():
                        last_planting_site = PlantingSite.objects.all().order_by('-created_at')[0]
                        f.id_planting_site = last_planting_site.id_planting_site
                        f.id_planting_site += 1
                    else:
                        f.id_planting_site = 100000
                    if request.POST.get('neighborhood_id'):
                        f.neighborhood = Neighborhood.objects.filter(id_neighborhood=request.POST.get('neighborhood_id'))[0]
                    if request.POST.get('district_id'):
                        f.district = District.objects.filter(id_district=request.POST.get('district_id'))[0]
                    if request.POST.get('basin_type_id'):
                        f.basin_type = BasinType.objects.filter(id_basin_type=request.POST.get('basin_type_id'))[0]
                    if request.POST.get('aspect_id'):
                        f.aspect = Aspect.objects.filter(id_aspect=request.POST.get('aspect_id'))[0]
                    if request.POST.get('orientation_id'):
                        f.orientation = Orientation.objects.filter(id_orientation=request.POST.get('orientation_id'))[0]
                    if request.POST.get('hardscape_damage_id'):
                        f.hardscape_damage = HardscapeDamage.objects.filter(id_hardscape_damage=request.POST.get('hardscape_damage_id'))[0]
                    if request.POST.get('status_id'):
                        f.status = PlantingSiteStatus.objects.filter(id_planting_site_status=request.POST.get('status_id'))[0]
                    else:
                        f.status = PlantingSiteStatus.objects.filter(id_planting_site_status=9)[0]
                    if f.zipcode:
                        f.property_zipcode = f.zipcode
                    f.created_by_fuf = True
                    f.created_by = request.user 
                    f.save()
        except IntegrityError:
            sleep(random.uniform(0.001, 0.5)) # chill out, try again
            messages.success(request, "Still creating previous site, trying again...")
            continue

因此,它尝试创建对象,如果由于完整性错误而失败,它将Hibernate一秒钟,然后重试。到目前为止,一切都很好,我的同事正在现场使用它,我还没有看到任何错误。

 类似资料:
  • 问题内容: 我正在跟着我先前提出的一个问题,在这个问题中,我试图寻求从愚蠢/编写不佳的mysql查询到postgresql的转换。我相信我成功了。无论如何,我正在使用从mysql数据库手动移动到postgres数据库的数据。我正在使用如下查询: 我有理由相信这很好。但是,这导致了新问题。尝试提交时,我从django收到一条错误,指出: 我已经看过这里发布的一些回复,但是我还没有找到解决我的问题的方

  • 我有一个笑话模型: 现在,当我试图迁移最后一行时,我得到了错误。基本上,我想将一个用户链接到Joke对象,因为我已经有了一个数据库,所以我希望默认值为1,这是管理员用户的id(我检查过了...).Makemigrations工作正常,但是当我尝试迁移时,我得到了这个: 我真的不明白怎么了。有什么想法吗?

  • 我有这样的桌子: 我试图插入一些查询到另一个表(device_usage_test1)。这是我的表: 这是我的插入命令: 稍后,我将在device_usage_test1上创建一个插入查询。所以我的设备序列必须是唯一的。但是当我尝试用deviceserial (unique)插入时。它显示错误:< code >错误:重复的键值违反了唯一约束“device _ usage _ device seri

  • 我在创建应用程序时遇到了这个问题。因此,每当我添加第一条评论时,问题都不会出现,但当我第二次尝试时,我会收到此错误: 重复的键值违反了唯一约束“tripplanner_discussion_author_id_key”详细信息:键 (author_id)=(1) 已存在。 我试图把放到 models.py,但它根本没有帮助。 models.py views.py 更新 当我登录到另一个用户时,一个

  • 如果存在,上面的代码通过按用户名搜索来获取用户,如果不存在,则创建一个新对象,并更新其属性并将其保存回数据库。 理想情况下,该代码应该处理对象已经存在于数据库中的情况。但它抛出了以下错误: 我不明白这是为什么。在互联网上搜索,发现这可能是因为指数被破坏,并已重置序列,但无法找到确切的原因和解决方案。请帮我做这件事。预先感谢

  • 我在django应用程序中创建了一个模型,并从pgadmin将数据填充到表中,但现在当我试图从应用程序创建记录时,它抛出了这个完整性错误: 重复的键值违反了唯一约束“packsapp_foo_pkey” 详细信息:键(id)=(4)已经存在。 这是models.py 我是否总是必须从应用程序本身插入数据? Views.py