Django 1.5 + Postgres 数据库记录消失

标签 django database postgresql orm

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

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

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

我的问题是:

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

编辑:

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

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

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

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

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

在这里阅读 Django 的事务选项:https://docs.djangoproject.com/en/1.5/topics/db/transactions/#tying-transactions-to-http-requests

最佳答案

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

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

Django’s default behavior is to run with an open transaction which it commits automatically when any built-in, data-altering model function is called. For example, if you call model.save() or model.delete(), the change will be committed immediately

(以上摘自1.5文档)

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

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

3) pk == 无检查

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

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

关于Django 1.5 + Postgres 数据库记录消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027340/

相关文章:

mysql - 如何授予对mysql的root访问权限?

MySQL数据库设计问题

mysql - Adobe CQ5 的外部数据库?

sql - 如何重复 SQL 插入直到 pg-promise 成功?

mysql - MySql数据库转换为Postgres数据库时没有自动增量

python - 内联 django shell 与 python shell 中的变量范围

python - 在 Django 1.8 中使用 MySQL 连接器时出现问题

python - Django key 泄露

python - 如何在 django channel 中设置连接超时?

postgresql - 在 Rails 中使用多态模型连接数据库 View