Django ORM在测试中不执行SELECT查询

时间:2014-04-29 15:04:39

标签: python django django-south

我最近在从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属性包含来自INSERT调用的doc.save() SQL,但是包含(在任何时候)SELECT来自三个现有SearchDocument SELECT查询中的任何一个应该执行到此点的SQL。

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

编辑:经过多次黑客攻击后,我已经能够确定将此测试类移至SimpleTestCase而不是TestCase类,其中TransactionalTestCase子类(其中将每个测试包装在数据库事务中)解决了我看到的问题,这些问题是在保存后没有显示的项目。看来事务管理中的某些事情导致了保存问题。

1 个答案:

答案 0 :(得分:0)

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

  

经过多次黑客攻击之后,我已经能够确定将此测试类移动到SimpleTestCase而不是TestCase类,其子类TransactionalTestCase(它在数据库事务中包装每个测试)解决了我的问题在他们被保存之后看到没有出现的物品。看来事务管理中的某些事情导致了保存问题。