我有以下代码:
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_error
在Syntax 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
也就是说,这是执行upsert
or的不好方法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然后我得到了与上述相同的错误。 它没有
我正试图插入数据库,但我在日志上看到了这样的消息: 我找到了这个查询以获取违反的密钥: