我一直在努力将数据保存到MySQL数据库。
这是一个Django 1.4.22遗留项目,运行几个芹菜驱动的任务来生成报告。
起初我使用了get_or_create方法,但很快就发现它没有正常运行,因为它们存在很多重复输入错误。 所以我依赖于以下内容,创建一个查询集,然后使用exists()方法检查它,然后在必要时创建它或更新它:
每次只能找到一个实例(这就是我想要进行更新或创建操作的原因)
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)
所以我有这个丑陋的尝试,但它仍然没有像我在异常体上所做的那样,快照= qs_snapshot.get()现在提出了一个 DoesNotExist:StatsSnapshot匹配查询不存在。这怎么可能呢?我仔细检查了一下!
我已经尝试过这里给出的几个技巧,包括mysql序列的修复,但似乎没有什么能解决它。此外,每次都会出现不同的报告(列表)
答案 0 :(得分:0)
<强>更新强>:
我再次阅读代码并注意到一个问题:在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