【问题标题】:Django 1.5 + Postgres Database Records DisappearingDjango 1.5 + Postgres 数据库记录消失
【发布时间】:2016-01-06 18:10:42
【问题描述】:

我们的系统允许人们下订单,其中包含一种或多种产品。在上个月每周 1500 笔交易中,我有两个订单根本不再在数据库中。

我的日志表明我们已经通过了产品 ORM 对象的创建,以及后续修改和对 save() 的调用,以及订单 ORM 对象的创建,随后的修改和对 save() 的调用.

发生这种情况后,从日志中可以看出,我们成功联系了我们的支付处理方,一切都恢复了,但数据库中没有记录已创建的痕迹。

我的问题是:

  1. Django 的 ORM 缓冲区是否以某种方式创建了对象?也许处理在某个时候完全停止(没有记录任何异常),并且数据库中还没有真正存在的对象。
  2. 我是唯一可以访问管理站点的人,我当然没有进入并删除特定记录。我还没有实现删除订单或产品的功能,因为我希望它们永远在数据库中。有没有其他我不知道的对象创建成功后可以删除的方法?
  3. 我读到检查 pk 成员的 None 是确定对象是否已写入数据库的规范方法。在我的复制案例中,此检查通过。

编辑:

e4c5 的出色回答让我了解了 Django 的数据库事务行为选项。另外两个环境因素导致了这种行为,而我无法诊断它:

  1. 我们启用了 Django 的 TransactionMiddleware,如果视图没有成功返回,它会回滚所有数据库操作。
  2. 日志配置问题是在调试服务器中运行时在此特定模块中显示未捕获的异常堆栈跟踪,但在我们的生产环境 (nginx/supervisor/gunicorn) 中运行时却没有。

调用 create() 和 save() 方法后引发未捕获的异常,这导致 TransactionMiddleware 回滚数据库条目。日志记录问题是禁止记录未捕获的异常跟踪,所以我不知道发生了什么。

对于这个特定的视图,我启用了 Django 的默认事务行为:

with transaction.autocommit():
    ...do my stuff...

在此处了解 Django 的事务选项:https://docs.djangoproject.com/en/1.5/topics/db/transactions/#tying-transactions-to-http-requests

【问题讨论】:

  • 也许你的应用程序忘记提交了?

标签: django database postgresql orm


【解决方案1】:

1) Django 的 ORM 缓冲区是否以某种方式创建了对象?

没有任何缓冲。当您说保存时,对象是 saved,除非您更改了自动提交行为。

Django 的默认行为是使用它打开的事务运行 当任何内置的数据更改模型函数时自动提交 叫做。例如,如果您调用 model.save() 或 model.delete(), 更改将立即提交

(以上来自1.5文档)

2) 有没有其他我不知道的对象创建成功后可以删除的方法?

可以使用数据库客户端直接在数据库中删除对象。

3) pk == 无检查

如果对象尚未保存,则 pk 为 None 并在保存后获取一个正整数值(假设您的主键是一个自动字段)。有一个警告,如果您更改了自动提交行为并且您正在手动管理事务,则该对象可能会获取一个非空 pk,但在提交之前它可能不存在于数据库中。

在事务提交之前,只有当前事务才能看到这个非空主键。如果它被回滚,该对象将不复存在。

【讨论】:

  • 将此标记为答案,因为它直接将我引向了问题所在。请参阅我的编辑以了解导致这种误解的环境细节。
  • 很高兴知道它已经解决了。
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多