-1

我正在 Tornado 中编写一个与 HTML5 WebSockets 一起使用的 Python 服务器。我的服务器通过 JavaScript 创建与客户端浏览器的连接来工作。创建连接后,它会保持打开状态,直到浏览器(或服务器将其关闭)。我需要定期检查我的模型之一是否已更改或数据库是否已更新。

这是演示我的意思的代码示例:

>>> mymodels = MyModel.objects.all()
>>> len(mymodels)
150
>>> # Some stuff happens on the client and the model is changed, one more entry is added
>>> mymodels = MyModel.objects.all()
>>> len(mymodels)
151

这一切都发生在服务器应用程序中,其中模型的更改将发生在服务器脚本运行的一个“会话”中。无论如何我可以检查新对象或刷新我的 Django 数据库吗?

如果还不清楚,我的意思是一个例子:假设我有一个名为 MyModel 的模型。首次运行服务器脚本时,它有 150 个不同的条目或数据库行。我从我的客户端与我的服务器建立 WebSocket 连接,并请求在发生新更改时更新我。在我的客户端的其他地方,其他一些用户做了一些事情,在我的数据库中为 MyModel 类创建了一个新行。我的服务器虽然仍然保持与原始客户端的相同连接,但需要能够在不停止执行的情况下检测到该更改。

定期检查不是问题,它实际上确保 Django 数据库 API 知道新添加的信息。无论如何我可以确保发生这种情况吗?最初发布的示例代码实际上不起作用。无论我向模型添加多少项,MyModel.objects.all() 的长度仍然是 150。如果我重新启动我的 Django shell,它会更新计数。

我尝试过的其他一些事情:

  • 使用内置的 reload() 函数重新加载模型模块。
  • 为某组 MyModel 过滤模型
  • 使用原始 SQL 查询来选择所有内容并根据特定条件进行过滤

无论我对数据库进行多少更改,所有这些方法都会返回相同数量的 MyModel 对象。有趣的是,在 MySQL Workbench 中运行原始 SQL 会产生预期的结果。

4

2 回答 2

1

我想到了!强制 Django 更新其数据库引用的最简单方法是关闭数据库连接。Django 会根据需要自动创建一个新的。

django.db.close_connection()

如果您在关闭连接之前需要提交更改,这将完成与上述相同的操作,但保留您所做的更改。(即您不需要关闭连接,因为无论如何这都会刷新数据库)

django.db.connection._commit()

感谢您的评论,祝您有美好的一天!

于 2013-10-14T16:27:39.703 回答
0

如果这一切都在服务器端脚本运行的一个“会话”中,也许你已经在一个数据库事务中运行了整个事情(这意味着没有其他东西可以看到它)——尽管你可以逐渐看到它们在 Workbench 中建议不要。话虽如此,值得检查一下您对交易的处理方式。

另外,您是否阅读了这篇文章以确保 Django 正在做您认为它正在做的事情?

于 2013-10-14T16:27:53.803 回答