【问题标题】:Django ORM not performing SELECT queries in testingDjango ORM 在测试中不执行 SELECT 查询
【发布时间】:2014-04-29 15:04:38
【问题描述】:

最近从 Django 1.4 升级到 Django 1.6 后,我在当前应用程序中遇到了 Django ORM 的问题。此问题在运行测试时出现,而不是在开发或生产环境中运行时出现。

更具体地说,我们有一个 post_save 钩子,它从表中收集信息,这些表是我们的主要数据对象的子类,并将存储在这些对象中的数据合并为一个 SearchDocument 对象,然后存储和查询该对象以提供完整的-界面上的文本搜索。这适用于开发和生产环境,但是在尝试运行单元测试时,我们会遇到测试失败的问题。

我们正在调试的方法现在看起来像这样:

def _update_search_document( self, doc ):
    """Updates and saves an existing search document for this model.
    This will sync the search text and key/value attributes."""
    # A bunch of code updating the model properties prior to saving.
    doc.save()
    print SearchDocument.objects.all()
    print connection.queries:

此代码正确保存,但随后对SearchDocument.objects.all() 的调用返回[]connection.queries 属性包含来自doc.save() 调用的INSERT SQL,但 包含 (在任何时候)SELECT SQL 来自三个现存的 SearchDocument SELECT 查询中的任何一个,这些查询应该已经执行到该点。

据我所知,这段代码在我们从 Django 1.4 迁移到 Django 1.6 之前就可以运行。我知道一些查询逻辑在 1.4 和 1.6 之间发生了变化,我想知道是否有一个设置(可能是围绕缓存?)现在导致我们的测试出现问题。

编辑:经过更多的修改,我已经能够确定将这个测试类移动到 SimpleTestCase 而不是 TestCase 子类 TransactionalTestCase 的类(它将每个测试包装在数据库事务中)解决了我看到的项目在保存后未显示的问题。似乎该事务管理中的某些内容导致了保存问题。

【问题讨论】:

  • Django 查询集是惰性的。尝试遍历查询集,然后检查connection.queries,例如for _ in SearchDocument.objects.all(): break。另外,您是否将DEBUG 设置为True
  • 遍历查询集显示相同的行为(print 也应该评估查询集)并且 DEBUG 设置为 true。如果设置为 false,则根本不会显示任何查询。

标签: python django django-south


【解决方案1】:

引用我的编辑,因为这是我们最终解决它的方法:

经过更多的修改后,我已经能够确定将这个测试类移动到 SimpleTestCase 而不是 TestCase 类,该类是 TransactionalTestCase 的子类(将每个测试包装在数据库事务中)解决了我看到的问题项目保存后未显示。似乎该事务管理中的某些内容导致了保存问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2021-03-08
    相关资源
    最近更新 更多