gpt4 book ai didi

python - Django:修复了 IntegrityError(重复条目),现在获取DoesNotExist

转载 作者:行者123 更新时间:2023-11-29 21:34:57 25 4
gpt4 key购买 nike

我在将数据保存到 MySQL 数据库时遇到了困难。

这是一个 Django 1.4.22 遗留项目,运行多个 celery 驱动的任务来生成报告。

起初我使用了 get_or_create 方法,但很快就发现它运行不正确,因为有很多重复条目错误。因此,我依赖于如下内容,创建一个查询集,然后使用 contains() 方法检查它,然后在必要时创建它或更新它:

每次只能找到一个实例(这就是我想要进行更新或创建操作的原因)

qs_snapshot = StatsSnapshot.objects.filter(list=list_id,
created_at__gte=today,
created_at__lt=end_day)
if qs_snapshot.exists():
snapshot = qs_snapshot.get()
qs_snapshot.update(**dict_stats)
else:
try:
snapshot = StatsSnapshot.objects.create(**dict_stats)
except IntegrityError:
# Duplicate entry error, upgrade the data instead or recreating it
# There's no atomicity guaranted so sometimes there's really an
# instance saved after the exists() and before the create()
snapshot = qs_snapshot.get()
qs_snapshot.update(**dict_stats)

所以我做了这个丑陋的尝试,但它仍然没有做我在异常主体上所观察到的事情, snapshot = qs_snapshot.get() 现在引发一个 DoesNotExist: StatsSnapshot 匹配查询不存在。这怎么可能?我正在仔细检查!

我已经尝试了这里给出的几个提示,包括修复 mysql 序列,但似乎没有任何解决办法。而且每次都会发生不同的报告(列表)

最佳答案

更新:

我再次通读代码并注意到一个问题:在 except IntegrityError: 中,您无法执行 qs_snapshot.get() 因为没有返回任何对象通过 qs_snapshot。您在 qs_snapshot.exists() 之前检查过,如果没有,则无法在查询集上执行 .get() 因为没有对象,这就是为什么您得到 DoesNotExist异常。

更新 2:根据您的意见,请尝试以下操作:

...
else:
try:
snapshot = StatsSnapshot.objects.get(**dict_stats)
except StatsSnapshot.DoesNotExist:
snapshot = StatsSnapshot.objects.create(**dict_stats)
except StatsSnapshot.MultipleObjectsReturned:
# it returned multiple objects, decide here what you want to do
pass

关于python - Django:修复了 IntegrityError(重复条目),现在获取DoesNotExist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34991792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com