当前位置: 首页 > 面试题库 >

IntegrityError:区分唯一约束和非空违反

岳浩
2023-03-14
问题内容

我有以下代码:

try:
    principal = cls.objects.create(
        user_id=user.id,
        email=user.email,
        path='something'
    )
except IntegrityError:
    principal = cls.objects.get(
        user_id=user.id,
        email=user.email
    )

它尝试创建具有给定ID和电子邮件的用户,如果已经存在一个用户-尝试获取现有记录。

我知道这是一个不好的构造,无论如何都会对其进行重构。但是我的问题是这样的:

我如何确定IntegrityError发生了什么:一种与unique约束违反有关的(在(user_id,电子邮件)上有唯一键)或一种与not null约束有关的(path不能为null)?


问题答案:

psycopg2SQLSTATE作为pgcode成员提供了例外,它为您提供了相当细粒度的错误信息以进行匹配。

python3
>>> import psycopg2
>>> conn = psycopg2.connect("dbname=regress")
>>> curs = conn.cursor()
>>> try:
...     curs.execute("INVALID;")
... except Exception as ex:
...     xx = ex
>>> xx.pgcode
'42601'

有关代码含义,请参见PostgreSQL手册中的
附录A:错误代码
。请注意,您可以在前两个字符上粗略地匹配广泛的类别。在这种情况下,我可以看到SQLSTATE42601syntax_errorSyntax Error or Access Rule Violation类别中。

您想要的代码是:

23505   unique_violation
23502   not_null_violation

所以你可以这样写:

try:
    principal = cls.objects.create(
        user_id=user.id,
        email=user.email,
        path='something'
    )
except IntegrityError as ex:
    if ex.pgcode == '23505':
        principal = cls.objects.get(
            user_id=user.id,
            email=user.email
        )
    else:
        raise

也就是说,这是执行upsertor的不好方法merge。@
pr0gg3d大概是建议使用Django的正确方法的正确方法。我不使用Django,所以我无法对此发表评论。有关upsert /merge的一般信息,请参阅depesz关于该主题的文章。



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

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

  • 我有一个Django模型,其定义类似于以下内容: 起初,约束并不存在;我刚刚添加了它,并运行了。这导致了以下迁移(): 然而,当我尝试< code > python manage . py migrate 时,我得到以下错误: django.db.utils.Integrity错误:重复的键值违反了唯一约束“django_migrations_pkey”详细信息:键 (id)=(326) 已存在。

  • 遇到了一点问题,当我运行''时,我收到了上述错误消息,我正在一个相当旧的站点上工作。它'运行带有postgres DB的django 1.2.6。 运行没有安装南,我设法让它工作。运行pythonmanage.py模式迁移-初始contact_enquiries运行良好并要求我迁移。然后我运行pythonmanage.py迁移contact_enquiries然后我得到了与上述相同的错误。 它没有

  • 我正试图插入数据库,但我在日志上看到了这样的消息: 我找到了这个查询以获取违反的密钥: