Django+postgres auth_user 重复键值违反唯一约束“auth_user_username_key”
Posted
技术标签:
【中文标题】Django+postgres auth_user 重复键值违反唯一约束“auth_user_username_key”【英文标题】:Django+postgres auth_user duplicate key value violates unique constraint "auth_user_username_key" 【发布时间】:2019-03-20 13:52:57 【问题描述】: try:
django_user = User.objects.get(username__iexact=self.username)
except User.DoesNotExist:
django_user = User(username=self.username)
django_user.is_staff=True
django_user.save()
如果存在则通过用户名搜索获取用户,如果不存在则创建新对象并更新其属性并将其保存回db。
理想情况下,此代码应处理对象已存在于数据库中的情况。但它会引发以下错误
duplicate key value violates unique constraint "auth_user_username_key"
DETAIL: Key (username)=(xxxxxxxx@yyyyy.com) already
exists.
我不明白这是什么原因。在互联网上搜索,发现这可能是因为索引已损坏并且必须重置序列但找不到确切的原因和解决方案。 请帮我解决一下这个。 提前致谢
【问题讨论】:
我觉得你应该用create_user
来做用户。
您确定第一个事务 - 创建用户 - 在您查询用户是否存在之前完成?我怀疑它是索引,我已经发生过很多次这种事情,而且它几乎总是一个竞争条件,你没有正确保存新对象,或者你没有以某种方式查询用户表正确。
可以发布控制台日志,以及更多代码
@Dave 。我还检查了,发现我可能与索引有关。可以告诉如何为此重置索引。或者我该如何解决。
@RohitNegi 最简单的检查方法是从一个空数据库开始,看看它是否有效。如果还是不行,那就不是索引了。
【参考方案1】:
我已经有一段时间没有刷新我的 Django 技能了,但我记得你 可以使用另一种方法来解决这个问题,例如:
if Entry.objects.filter(username=self.username).exists():
# DO IF STUFF
else:
# DO ELSE STUFF
如果您的用户名不是 pk 密钥,那么您可能必须将其设置为 唯一,这样可以防止用户名重复。
Oficial Django reference
但是通过您使用 self.username 变量的方式,它在我的脑海中挖掘了一些东西。似乎您有一些课程需要制作此类功能。而且我担心您拥有的这种代码和平位于同一个类模型声明中,根据您想要执行的查询类型,您应该记住这一点:
如果您想检查一些尚未插入数据库的用户名,那么它将没有 pk,您将无法在数据库中查找此类数据。通过在 .save() 之前调用它,可能会发生一些错误。
希望对你有所帮助。
【讨论】:
如果您建议的代码 sn-p。是否有针对性地解决这个问题。如果是这样,您共享的代码 sn-p 中没有发生的原因是什么 如果我做对了。我很确定我没有在我共享的第一个和最后一个代码语句之间保存对象。在try: django_user = User.objects.get(username__iexact=self.username) except User.DoesNotExist: django_user = User(username=self.username)
之后和django_user.save()
之前。没有其他存档。
您可以在问题描述中添加您正在使用的用户模型吗?它是 django 的默认用户模型。请扩展一下你的函数的代码片段。以上是关于Django+postgres auth_user 重复键值违反唯一约束“auth_user_username_key”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 django 向默认 auth_user 模型添加额外的模型字段
在 django 中将自定义字段添加到 auth_user 表
Django 1.8 和 syncdb / migrate 的 auth_user 错误
Django:异常类型:IntegrityError 唯一约束失败:auth_user.username
Heroku中的Django部署:createsuperuser失败:django.db.utils.OperationalError:没有这样的表:auth_user