我们有一个在线商店的网络应用程序,由django,postgresql和heroku提供支持。
对于特定的广告系列(您可以认为像购买产品这样的广告系列),我们已经成功售出了1万多本。但是根据我们的Sentry报告,我们的一些用户遇到了此错误。这些用户的通用规范是;他们都没有购买前的地址信息。通常,用户在注册后立即填写地址表格。如果没有,他们需要在购买产品时填写表格并将其一起提交。
这是跟踪的样子:
OperationalError: cursor "_django_curs_140398688327424_146" does not exist
(66 additional frame(s) were not displayed)
...
File "store/apps/store_main/templatetags/store_form_filters.py", line 31, in render_form
return render_to_string('widgets/store_form_renderer.html', ctx)
File "store/apps/store_main/templatetags/store_form_filters.py", line 20, in render_widget
return render_to_string('widgets/store_widget_renderer.html', ctx)
File "store/apps/store_main/widgets.py", line 40, in render
attrs=attrs) + "<span class='js-select-support select-arrow'></span><div class='js-select-support select-arrow-space'><b></b></div>"
OperationalError: cursor "_django_curs_140398688327424_146" does not exist
另一个奇怪的普遍现象是,失败之前sql查询之间存在异常消息。您可以在下图中看到它:
如果它们有某种联系,我要添加它。可能还相关的是,收到此错误的用户是在批量发送邮件后立即尝试购买广告系列的用户。因此,大量的流量可能是我们还不确定的原因。
我们向Heroku询问了有关该问题的信息,因为他们托管了Postgres,但他们也没有任何线索。
我知道此错误的正式原因是尝试在提交后到达游标。由于它是在事务处理后销毁的,因此尝试到达它会导致此错误,但在我们的方案中我看不到此错误。我们没有以任何方式触摸光标。我想念什么?什么会产生此错误?怎么预防呢?任何想法将不胜感激。
答案 0 :(得分:0)
发生错误的原因可能是您在模型中添加了字段,却忘记了进行迁移和迁移。
答案 1 :(得分:0)
如果您正在使用django-pytest并启用了优化--reuse-db
并已在测试运行之间进行数据库迁移,则需要再次重新创建数据库表。
pytest --create-db