子线程无法使用的模型数据

时间:2011-09-08 19:52:51

标签: django

我正在使用Django-1.3和MySQL数据库引擎。

在单元测试用例的设置中(使用manage.py来运行测试),我创建了一个对象并保存它。

如果我从响应处理程序中查询对象(使用objects.filter),我可以很好地看到它。如果我使用python线程模块(threading.Thread)创建子线程并尝试相同的objects.filter调用,则它不会看到该对象。为什么子线程看不到我在单元测试设置中创建的条目,当它在父线程中可见时?

1 个答案:

答案 0 :(得分:1)

您需要使用TransactionTestCase而不是常规TestCase来执行此操作。如果不这样做,您在测试用例中对模型执行的修改(例如在您的设置中)实际上不会提交给DB,因此您的线程不可见。有关详细信息,请参阅Django doc about TransactionTestCase

另外,我发现需要重新创建线程中的连接。以下代码可以解决问题:

from django.db import connection    
connection.close()
cursor = connection.cursor()

不是您的情况,但是如果您使用SQLite,还需要在设置中指定TEST_NAME。如果没有,Django SQLite DB完全在内存中,并且不能在线程之间共享。

使用这种方法,我可以在线程中生成一个实时测试服务器,同时从产生Django测试用例控制selenium和DB。我从here

获取了服务器线程代码